首页 文章 精选 留言 我的

精选列表

搜索[网站开发],共10000篇文章
优秀的个人博客,低调大师

安卓开发_自定义控件_界面的简单侧滑

主界面 package com.itheima.news; import android.os.Bundle; import android.app.Activity; import android.view.Menu; import android.view.Window; public class NewsHomeActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //去掉头信息 requestWindowFeature(Window.FEATURE_NO_TITLE); setContentView(R.layout.activity_news_home); } } <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" > <com.itheima.news.MenuListGrouView android:layout_width="match_parent" android:layout_height="match_parent" > <include layout="@layout/item_menu_list" /> <include layout="@layout/main_showpage" /> </com.itheima.news.MenuListGrouView> </RelativeLayout> 显示布局文件1 <?xml version="1.0" encoding="utf-8"?> <ScrollView xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="200dp" android:layout_height="match_parent" > <LinearLayout android:layout_width="200dp" android:layout_height="match_parent" android:background="@drawable/menu_bg" android:orientation="vertical" > <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="10dp" android:drawableLeft="@drawable/tab_dingyue" android:gravity="center" android:text="text1" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="10dp" android:drawableLeft="@drawable/tab_juhe" android:gravity="center" android:text="text1" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="10dp" android:drawableLeft="@drawable/tab_local" android:gravity="center" android:text="text1" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="10dp" android:drawableLeft="@drawable/tab_news" android:gravity="center" android:text="text1" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="5dp" android:drawableLeft="@drawable/tab_ties" android:gravity="center" android:text="text1" /> </LinearLayout> </ScrollView> 显示布局文件2 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:background="@drawable/top_bar_bg" android:gravity="center" android:padding="10dp" android:text="我的小新闻 " android:textSize="20sp" /> <TextView android:layout_width="match_parent" android:layout_height="match_parent" android:gravity="center" android:text="点击浏览内容 " /> </LinearLayout> 自定义控件 的页面 public class MenuListGrouView extends ViewGroup { private int downX; private int interDownX; private int interDownY; public MenuListGrouView(Context context) { this(context,null); } public MenuListGrouView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } public MenuListGrouView(Context context, AttributeSet attrs) { this(context, attrs,-1); } //对子控件进行测量 @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); //获取子控件 View liftMenuView = getChildAt(0); View rightMainView = getChildAt(1); //对子控件进行测量 rightMainView.measure(widthMeasureSpec, heightMeasureSpec); liftMenuView.measure(liftMenuView.getLayoutParams().width, heightMeasureSpec); } //进行排版设置 @Override protected void onLayout(boolean changed, int l, int t, int r, int b) { //找到相关控件 View liftMenuView = getChildAt(0); View rightMainView = getChildAt(1); //对控件进行排版 rightMainView.layout(l, t, r, b); liftMenuView.layout(-liftMenuView.getMeasuredWidth(), 0,0, b); } @Override public boolean onTouchEvent(MotionEvent event) { switch (event.getAction()) { case MotionEvent.ACTION_DOWN: //获取按下时的坐标 downX = (int) event.getX(); break; case MotionEvent.ACTION_MOVE: int moveX = (int) event.getX(); //计算偏移量 int shiftingX =downX -moveX ; //判断边界 int scrollX = getScrollX()+shiftingX; if (scrollX>0) { scrollTo(0, 0);//移动到指定的位置 } else if (scrollX<-getChildAt(0).getWidth()) { scrollTo(-getChildAt(0).getWidth(), 0); } else { //在上一次的移动的基础上进行移动 scrollBy(shiftingX,0); } downX = moveX ; break; case MotionEvent.ACTION_UP: //进行判断 int scrollUpX = (int) getScrollX(); if (scrollUpX>-getChildAt(0).getWidth()/2) { //如果向右滑动的距离小于右面控的一半的时候,那么就不显示右面的控件 scrollTo(0, 0); } else { //如果向右滑动的距离大于右面控件的一半的时候,那么就显示右面的控件 scrollTo(-getChildAt(0).getWidth(), 0); } break; default: break; } return true; } //消息传递机制来进行点击事件的滑动控制 @Override public boolean onInterceptTouchEvent(MotionEvent ev) { switch (ev.getAction()) { case MotionEvent.ACTION_DOWN: interDownX = (int) ev.getX(); interDownY = (int) ev.getY(); break; case MotionEvent.ACTION_MOVE: int interMoveX = (int) ev.getX(); int interMoveY = (int) ev.getY(); //计算偏移量 int interShiftingX = Math.abs(interMoveX - interDownX); int interShiftingY = Math.abs( interMoveY - interDownY); if (interShiftingX>interShiftingY) { //说明是侧滑 return true; } case MotionEvent.ACTION_UP: break; default: break; } return super.onInterceptTouchEvent(ev); } } 效果图

优秀的个人博客,低调大师

BBBUG音乐聊天室的开发故事和架构设计

办公室有个小伙伴喜欢拿音响放歌,然而总放一些动次打次的广场舞DJ曲目,同事听了都头大,每次让人家切歌又不方便 于是某同事吐槽:“我们点啥你放啥?” 一天之后…… “张三你刚说放啥来着?” “卧槽,我说的是刘德华的17岁,你这放的是谁的版本?” “17岁QQ音乐要会员,放不了。” …… 我实在看不下去了,要不写一个点歌平台? 说干就干,第一版俩小时搞定: 一个点歌端,爬虫爬各大平台,包括一些VIP歌曲也给爬下来,只能搜索,点歌。 一个导播端,可以看大伙点了什么歌,导播端可以插队播放,删除。 好,上线。 两天后…… 老板:“卧槽你们当办公室KTV呢?开音响听歌???” 好吧,所有人默默带上了耳机,但点歌端不能播放音乐,只能点歌,这一版宣告凉凉。 …… 那就升级吧: 这一版,不区分点歌端和导播端,所有端都一样,做一个共享队列,大伙点,大伙自己带耳机听。 一天后…… “你能不能让大家听到的歌进度保持一致?我还在听上一首,他们先进去的都已经自动播下一首了……” OK,继续升级,加歌曲同步。 好家伙这一次,跟KTV没啥区别了。 这一版有点意思,还加上了“送啤酒”这个小互动,是不是更像KTV了? 好吧我承认,这种小互动貌似没什么用,于是后来的版本掐掉了。 然而好景不长: “大厅这群人有毒吧?跟五条人杠上了?” “我实在是不敢恭维在座各位的歌单” “这都点的什么玩意歌啊……” “Mojito我实在是听得要吐了……” 好吧,那就安排,自己开房间听歌。 于是有了多房间的版本,每个人都可以创建自己的房间,听自己的歌。 顺便加上一个二级域名和独立域名的绑定功能,于是有了下面的设计图: 这就很棒了,大伙都可以在大厅一起听,也可以去自己房间里点歌听。 好好好景不长,需求又来了~ “自己的房间,能不能不点歌,自动播放自己点过的歌?” 安安安排! 那就来一个电台模式吧,设置了就自动播放自己的歌,有人点歌的话让他排队吧。 这下可以了吧? 安安稳稳听歌一周后…… “好无聊啊,光听歌,能让我听听相声小品吗?” 安安安安安排! 爬谁呢,就蜻蜓FM吧。 上线了小说故事模式…… 好好好好好景还是不长 “这个UI好丑啊,能换换吗?” 我也这么觉得,那就改吧,于是改成了这样 “白色是不是太晃了,出个暗黑模式呗?” “我TM……” 安安安安安安安排! 感觉还挺棒, 本以为故事到这里就基本结束了,然而,嗯。 “网页好烦人啊,能出个Windows客户端吗?” 安安安安安P,等下,C#我快忘干净了。 花俩小时回忆了下C#,又花俩小时学习了下 WTF…… 安安安安安安安排! 于是有了这个Windows客户端 好家伙,写完了,发布了,实际统计了下使用数据,使用人数不超过3,WTF???? “你这大部分是程序员在用,要不出个vscode的插件呗。” 我…… 故事快结束了吗? 天真。 “出个APP吧!” 我…… 好,安排,就拿Uniapp整一套吧。 体验还挺不错,不过因为音乐版权问题,这里就没上架AppStore。 “App下载好麻烦,整一套小程序吧?” 安安安安安安安安安安安安排! 整! 故事到这里就基本结束了,心累。 一口气把所有端的代码都开源了,欢迎有兴趣的小伙子给点点小星星呀。 Github https://github.com/HammCn Gitee https://gitee.com/bbbug_com 顺便附上整体的架构设计图 体验一下 https://www.bbbug.com

优秀的个人博客,低调大师

CLion 2021.1 Beta 发布,C/C++ 跨平台集成开发环境

CLion 2021.1 Beta 已正式发布,新版本修复了项目模型和更多的 MISRA 检查。 主要更新内容 对于 Makefile 项目 更新 Makefile 项目所使用的工具链会触发项目的重新加载 提取大量项目的 make target 现在可以正常工作了 对于使用 MinGW 工具链的 Makefile 项目,CLion 现在可以在加载项目时正确处理带 "\" 和 "/" 的目录 对于汇编数据库项目 Clang-cl 现在支持此类项目 新的 MISRA C 和 C++ 检查 异常对象不应具有指针类型 一些新的检查现在禁止使用特定的库函数,例如 stdlib.h 的 bsearch 和 qsort,ctime 库的时间处理函数,或者 cstdlib 库的 atof、atoi 和 atol 详情请查看更新公告。

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

用户登录
用户注册