Android之自定义控件深入

本文主要讲述两个知识点:popwindow的使用和通过继承View实现一个自定义控件,实现点击,手动按钮的效果.

popwindow的使用

//定义 popupWindowpopWin = new PopupWindow(MainActivity.this);popWin.setWidth(input.getWidth()); //设置宽度popWin.setHeight(200);  //设置popWin 高度popWin.setContentView(listView); //为popWindow填充内容popWin.setOutsideTouchable(true); // 点击popWin 以处的区域,自动关闭 popWinpopWin.showAsDropDown(input, 0, 0);//设置 弹出窗口,显示的位置

自定义控件实现开关拖动按钮

第一步:实现自定义控件要继承view

public class MyToggleButton extends View implements OnClickListener{

第二步:写构造函数并初始化

/*** 在代码里面创建对象的时候,使用此构造方法*/public MyToggleButton(Context context) {super(context);// TODO Auto-generated constructor stub}/*** 在布局文件中声名的view,创建时由系统自动调用。* @param context   上下文对象* @param attrs     属性集*/public MyToggleButton(Context context, AttributeSet attrs) {super(context, attrs);initView();}/*** 初始化*/private void initView() {//初始化图片backgroundBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.switch_background);slideBtn = BitmapFactory.decodeResource(getResources(), R.drawable.slide_button);//初始化 画笔paint = new Paint();paint.setAntiAlias(true); // 打开抗矩齿//添加onclick事件监听setOnClickListener(this);}

第三步:重写方法

/** view 对象显示的屏幕上,有几个重要步骤:* 1、构造方法 创建 对象。* 2、测量view的大小。 onMeasure(int,int);* 3、确定view的位置 ,view自身有一些建议权,决定权在 父view手中。  onLayout();* 4、绘制 view 的内容 。 onDraw(Canvas)*/@Override/*** 测量尺寸时的回调方法 */protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
//      super.onMeasure(widthMeasureSpec, heightMeasureSpec);/*** 设置当前view的大小* width  :view的宽度* height :view的高度   (单位:像素)*/setMeasuredDimension(backgroundBitmap.getWidth(),backgroundBitmap.getHeight());}//确定位置的时候调用此方法//自定义view的时候,作用不大
//  @Override
//  protected void onLayout(boolean changed, int left, int top, int right,
//          int bottom) {
//      super.onLayout(changed, left, top, right, bottom);
//  }/*** 当前开关的状态*  true 为开*/private boolean currState = false;@Override/*** 绘制当前view的内容*/protected void onDraw(Canvas canvas) {
//      super.onDraw(canvas);// 绘制 背景/** backgroundBitmap 要绘制的图片* left 图片的左边届* top  图片的上边届* paint 绘制图片要使用的画笔*/canvas.drawBitmap(backgroundBitmap, 0, 0, paint);//绘制 可滑动的按钮canvas.drawBitmap(slideBtn, slideBtn_left, 0, paint);}

第四步:监听点击与拖动事件

/*** 判断是否发生拖动,* 如果拖动了,就不再响应 onclick 事件* */private boolean isDrag = false;@Override/*** onclick 事件在View.onTouchEvent 中被解析。* 系统对onclick 事件的解析,过于简陋,只要有down 事件  up 事件,系统即认为 发生了click 事件* */public void onClick(View v) {/** 如果没有拖动,才执行改变状态的动作*/if(!isDrag){currState = !currState;flushState();}}/*** down 事件时的x值*/private int firstX;/*** touch 事件的上一个x值*/private int lastX;@Overridepublic boolean onTouchEvent(MotionEvent event) {super.onTouchEvent(event);switch (event.getAction()) {case MotionEvent.ACTION_DOWN:firstX = lastX =(int) event.getX();isDrag = false;break;case MotionEvent.ACTION_MOVE://判断是否发生拖动if(Math.abs(event.getX()-firstX)>5){isDrag = true;}//计算 手指在屏幕上移动的距离int dis = (int) (event.getX() - lastX);//将本次的位置 设置给lastXlastX = (int) event.getX();//根据手指移动的距离,改变slideBtn_left 的值slideBtn_left = slideBtn_left+dis;break;case MotionEvent.ACTION_UP://在发生拖动的情况下,根据最后的位置,判断当前开关的状态if (isDrag) {int maxLeft = backgroundBitmap.getWidth() - slideBtn.getWidth(); // slideBtn// 左边届最大值/** 根据 slideBtn_left 判断,当前应是什么状态*/if (slideBtn_left > maxLeft / 2) { // 此时应为 打开的状态currState = true;} else {currState = false;}flushState();}break;}flushView();return true; }

第五步:刷新当前状态

/*** 刷新当前状态*/private void flushState() {if(currState){slideBtn_left = backgroundBitmap.getWidth()-slideBtn.getWidth();}else{slideBtn_left = 0;}flushView(); }/*** 刷新当前视力*/private void flushView() {/** 对 slideBtn_left  的值进行判断 ,确保其在合理的位置 即       0<=slideBtn_left <=  maxLeft* */int maxLeft = backgroundBitmap.getWidth()-slideBtn.getWidth();  //  slideBtn 左边届最大值//确保 slideBtn_left >= 0slideBtn_left = (slideBtn_left>0)?slideBtn_left:0;//确保 slideBtn_left <=maxLeftslideBtn_left = (slideBtn_left<maxLeft)?slideBtn_left:maxLeft;/** 刷新当前视图  导致 执行onDraw执行*/invalidate();}

第六步:在layout中添加全类名使用

<com.zj.switchbutton.MyTrouggleButtonandroid:layout_width="wrap_content"android:layout_height="wrap_content"/>

运行效果

这里写图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/494394.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

麒麟芯片AI首席科学家,解读AI芯片如何让手机更智能

来源&#xff1a;华为摘要&#xff1a;8月31日&#xff0c;华为发布了新一代顶级人工智能手机芯片——麒麟980&#xff0c;成为全球首款采用7nm制程工艺的手机芯片。麒麟980能做到人脸识别、物体识别、物体检测、图像分割、智能翻译等&#xff0c;实现AI识别质的飞跃。今天&…

协议森林14 逆袭 (CIDR与NAT)

作者&#xff1a;Vamei 出处&#xff1a;http://www.cnblogs.com/vamei 严禁任何形式转载。 IPv4由于最初的设计原因&#xff0c;长度只有32位&#xff0c;所以只提供了大约40亿个地址。这造成了IPv4地址的耗尽危机。随后&#xff0c;IPv6被设计出来&#xff0c;并可以提供足够…

认知神经科学:美陆军高度关注的人工智能与生物科技的交叉学科领域

来源&#xff1a;天大神经工程近年来&#xff0c;随着“第三次抵消战略”的深入推进&#xff0c;美军重点部署人工智能、生物科技等前沿技术领域发展&#xff0c;寻求获取新的领先优势。作为人工智能与生物科技的交叉学科领域&#xff0c;认知神经科学具有颠覆未来作战样式的巨…

Android之自定义属性

安卓自定义属性主要有3个步骤 在values文件夹新建attrs.xml文件中声明属性&#xff0c;包括属性名和格式&#xff0c;format常用属性有string ,integer,reference等 <?xml version"1.0" encoding"utf-8"?> <resources><!-- 声明属性集…

log4j的配置方法

一、 介绍 Log4j是Apache的一个开放源代码项目&#xff0c;通过使用Log4j&#xff0c;我们可以控制日志信息输送的目的地是控制台、文件、GUI组件、甚至是套接口服务 器、NT的事件记录器、UNIX Syslog守护进程等&#xff1b;我们也可以控制每一条日志的输出格式&#xff1b;通…

中国智能制造发展趋势!

来源&#xff1a;中国电子信息产业发展研究院赛迪顾问认为&#xff0c;我国智能制造发展有三个趋势&#xff0c;即企业向系统方案解决供应商转型&#xff0c;生产更加柔性化、定制化&#xff0c;“互联网”促进价值链向价值网转变。一、智能制造装备企业逐步向系统方案解决供应…

Android开发中目前流行控件和知识点总结

1、SlidingMenu 滑动菜单 应用案例&#xff1a;Facebook 、 Path 2.0 、人人、网易新闻 下载地址&#xff1a; https://github.com/jfeinstein10/SlidingMenu 2、PullToRefresh 下拉刷新 应用案例&#xff1a;新浪微博 等等 &#xff0c;这个很长用哦&#xff01; 下载地址&…

李德毅:“反用驾驶脑”测认知能力,谁说酒驾一定违规?

来源&#xff1a;德先生摘要&#xff1a;从2016年阿尔法狗成功挑战人类智慧的这场世纪大战开始&#xff0c;“人工智能”便引发了全世界的关注。从2016年阿尔法狗成功挑战人类智慧的这场世纪大战开始&#xff0c;“人工智能”便引发了全世界的关注。为了让中国在人工智能这场“…

谷歌无人车十年记:理想背后的骨感现实 | 厚势汽车

来源&#xff1a;The Information编译&#xff1a;厚势摘要&#xff1a;即使是近 10 年后&#xff0c;Waymo 仍远没有实现真正的 L4&#xff0c;即使是在相对简单的郊区环境下。「全自动驾驶的汽车来了&#xff01;」去年 11 月&#xff0c;Waymo 搞了一个大新闻。公司宣布自己…

自定义控件之瀑布流与水波纹实现

本文主要讲述了利用android自定义控件实现瀑布流与水波纹效果 首先为实现效果&#xff0c;应了解touch事件在android中的传递机制 在执行touch事件时 首先执行dispatchTouchEvent方法&#xff0c;执行事件分发。 再执行onInterceptTouchEvent方法&#xff0c;判断是否中断事件…

医学信息学相关术语、缩语及专业名词

医学信息学相关术语、缩语及专业名词 很棒哦&#xff0c;分享了&#xff0c;需要的可以去瞅瞅http://www.med-informatics.cn/MedInfo_gloss/medinfo_gloss_p1.htm如果你到它的完整上再逛逛&#xff0c;发觉还有很多好资源&#xff0c;譬如&#xff1a;http://www.med-informat…

神经网络并不是尚方宝剑,我们需要正视深度 NLP 模型的泛化问题

来源&#xff1a;AI 科技评论前段时间的文章《顶会见闻系列&#xff1a;ACL 2018&#xff0c;在更具挑战的环境下理解数据表征及方法评价》中&#xff0c;我们介绍了 ACL 大会上展现出的 NLP 领域的最新研究风向和值得关注的新进展。从这些新动向上我们似乎应该对深度学习 NLP …

信息技术智库丨月度大考试

【未来的你&#xff0c;会感谢今天努力的你】每日两题&#xff0c;一难一易&#xff0c;每天进步一点点&#xff0c;可能会直接导致一场面试的成功&#xff0c;或工作的轻松搞定&#xff0c;从而升职加薪迎娶白富美&#xff0c;加油小伙伴&#xff01; &#x1f345;举办场地&a…

智能交通大数据及云应用平台解决方案

来源&#xff1a;网络大数据摘要&#xff1a;随着日益增长的交通“大数据”&#xff0c;给交通管理创新带来的新挑战&#xff0c;以及对交通管理工作提出的新要求&#xff0c;交通信息化建设必然步入云计算智慧应用阶段&#xff0c;利用云计算破解当前诸多交通瓶颈问题。什么是…

106项人工智能创新项目名单公布,唱响“智能化”主旋律

来源&#xff1a;专知摘要&#xff1a;9月5日&#xff0c;工信部官网公示了2018年人工智能与实体经济深度融合创新项目名单。9月5日&#xff0c;工信部官网公示了2018年人工智能与实体经济深度融合创新项目名单。据了解&#xff0c;2018年人工智能与实体经济深度融合创新项目名…

利用TabWidget实现底部菜单

TabWidget类似于通话记录的界面&#xff0c;通过切换多个标签从而显示出多个不同内容&#xff0c;能够展示内容丰富的页面信息&#xff0c;而且彼此之间不会干扰&#xff0c;有利于展示。下面&#xff0c;通过一个例子来学习用法 首先用一个类来继承TabActivity 在开发之前&a…

信通院2018人工智能发展白皮书技术篇重磅发布

来源&#xff1a;网路大数据9月6日&#xff0c;2018中国人工智能峰会(CAIS2018)在南京国际博览会议中心召开。斯坦福客座教授吴恩达以Landng.ai创始人、CEO的身份出席了峰会&#xff0c;并在主论坛上做了题为《人工智能赋能新时代》的主题演讲。除了各路大咖的精彩演讲之外&…

量子计算赛道上的巨头拉锯战

来源&#xff1a;网易智能据国外媒体报道&#xff0c;长期以来量子计算机一直被吹捧为功能强大得令人难以置信的机器。相比于世界上现有的计算机&#xff0c;量子计算机能够以更快的速度解决极其复杂的计算问题。但目前还没有就开发量子计算机的最佳方式达成一致。最终谁将赢得…

信通院AI白皮书:硬核干货一文打尽,从技术流派到应用趋势【附下载】

来源&#xff1a;智东西摘要&#xff1a;从产业发展的角度&#xff0c;分析AI技术现状、问题以及趋势&#xff0c;盘点智能语音、语义理解、计算机视觉等相关应用。自2016年AlphaGo击败李世石之后&#xff0c;人工智能&#xff08;AI&#xff09;这个再度翻红的科技热词已经在争…

正则学习笔记

用途 字符匹配 语法 常用元字符 []    区间范围框 枚举值  [a-z0-9A-Z_] |    分枝条件或 \    特殊转义符&#xff08;取消转义&#xff09; \W [^A-Za-z0-9_] [\r\n] 换行符匹配 [\u4e00-\u9fa5] 汉字 [\s\S] 任意字符 限定符 贪婪匹配&…