《Android进阶之光》--View体系与自定义View
No1:
View的滑动
1)layout()方法的
public class CustomView extends View{private int lastX;private int lastY;public CustomView(Context context,AttributeSet attrs,int defStyleAttr){super(context,attrs,defStyleAttr);}public CustomView(Context context,AttributeSet attrs){super(context,attrs);}public CustomView(Context context){super(context);}public boolean onTouchEvent(MotionEvent event){//获取手指摸点的横坐标和纵坐标int x = (int)event.getX();int y = (int)event.getY();switch(event.getAction()){case MotionEvent.ACTION_DOWN:lastX = x;lastY = y;break;case MotionEvent.ACTION_MOVE://计算移动的距离int offsetX = x - lastX;int offsetY = y - lastY;//调用layout方法来重新放置它的位置layout(getLeft()+offsetX,getTop()+offsetY,getRight()+offsetX,getBottom()+offsetY);break;}return true;} }
2)offsetLeftAndRight()与offsetTopAndBottom()
对上面代码进行修改
case MotionEvent.ACTION_MOVE://计算移动的距离int offsetX = x - lastX;int offsetY = y - lastY;//对left和right进行偏移 offsetLeftAndRight(offsetX);//对top和bottom进行偏移 offsetTopAndBottom(offsetY);break;
3)LayoutParams(改变布局参数)
同样对上面代码进行修改
case MotionEvent.ACTION_MOVE:ViewGroup.MarginLayoutParams layoutParams = (ViewGroup.MarginLayoutParams)getLayoutParams();layoutParams.leftMargin = getLeft() + offsetX;layoutParams.topMargin = getTop() + offsetY;setLayoutParams(layoutParams);break;
4)动画
5)scrollTo与scrollBy
scrollTo(x,y)表示移动到一个具体的坐标点,而scrollBy(x,y)表示移动的增量为dx、dy。其中scrollBy最终也是要调用scrollTo的。
View.java的scrollBy和scrollTo源码
public void scrollTo(int x,int y){if(mScrollX!=x || mScrollY!=y){int oldX = mScrollX;int oldY = mScrollY;mScrollX = x;mScrollY = y;invalidateParentCaches();onScrollChanged(mScrollX,mScrollY,oldX,oldY);if(!awakenScrollBars()){postInvalidateOnAnimation();}} }public void scrollBy(int x,int y){scrollTo(mScrollX+x,mScrollY+y); }
6)Scroller
public CustomView(Context context,AttributeSet attrs){super(context,attrs);mScroller = new Scroller(context); }@Override public void computeScroll(){super.computeScroll();if(mScroller.computeScrollOffset()){((View)getParent()).scrollTo(mScroller.getCurrX(),mScroller.getCurrY());invalidate();} }public void smoothScrollTo(int destX,int destY){int scrollX = getScrollX();int delta = destX-scrollX;mScroller.startScroll(scrollX,0,delta,0,2000);invalidate(); }//最后调用 mCustomView.smoothScrollTo(-400,0);
No2:
View的measure流程,ViewGroup中定义了measureChildren方法
View和ViewGroup中均没有实现onLayout方法
No3:
View的draw流程
1)绘制背景:View.drawBackground()
2)绘制View的内容:重写View.onDraw()
3)绘制子View:ViewGroup.dispatchDraw()对子View进行遍历->ViewGroup.drawChild()->View.draw()
4)绘制装饰:View.onDrawForeground()
No4:
自定义View
1)继承系统控件的自定义View:重写onDraw()
2)继承View的自定义View:重写onDraw()、考虑warp_content属性以及padding属性设置、或者自定义属性、考虑是否重写onTouchEvent()
3)自定义组合控件
4)自定义ViewGroup:重写onLayout()、处理warp_content属性、处理滑动冲突、弹性滑动到其他页面、快速滑动到其他页面、再次触摸屏幕阻止页面继续滑动
转载于:https://www.cnblogs.com/anni-qianqian/p/8505978.html
《Android进阶之光》--View体系与自定义View相关推荐
- Android进阶之光读书笔记——第三章:View体系与自定义View
第三章 View体系与自定义View 本章将介绍Android中十分重要的View,在多本书中View是必讲的一节,Android群英传就讲了不少的View的知识,那么在这里我们再去复习一遍吧 3.1 ...
- View体系与自定义View(三)—— View的事件分发机制
1. 分析Activity的构成 一个Activity包含一个Window对象,这个对象是由PhoneWindow来实现的.PhoneWindow将DecorView作为整个应用窗口的根View. 而 ...
- Android仿IOS解锁密码界面-自定义view系列(6)
Android仿IOS解锁密码界面-自定义view系列 功能简介 主要实现步骤-具体内容看github项目里的代码 xml相关属性设置 Android Studio 代码 Android技术生活交流 ...
- Android安卓仿IOS音量调节-自定义view系列(4)
Android安卓仿IOS音量调节-自定义view系列 功能简介 主要实现步骤 xml相关属性设置 java代码 Android技术生活交流 更多其他页面-自定义View-实用功能合集:点击查看 Gi ...
- Android开发之制作圆形头像自定义View,直接引用工具类,加快开发速度。带有源代码学习
作者:程序员小冰,CSDN博客:http://blog.csdn.net/qq_21376985 QQ986945193 博客园主页:http://www.cnblogs.com/mcxiaobing ...
- Android开发之制作圆形头像自定义View,直接引用工具类,加快开发速度。带有源代码学习...
作者:程序员小冰,CSDN博客:http://blog.csdn.net/qq_21376985 QQ986945193 博客园主页:http://www.cnblogs.com/mcxiaobing ...
- Android绘图机制(三)——自定义View的实现方式以及半弧圆新控件
Android绘图机制(三)--自定义View的三种实现方式以及实战项目操作 在Android绘图机制(一)--自定义View的基础属性和方法 里说过,实现自定义View有三种方式,分别是 1.对现有 ...
- Android自定义view原理及自定义View示例
自定义view如何分类 自定义View:只需要重写onMeasure()和onDraw(),在没有现成的View,需要自己实现的时候,就使用自定义View,一般继承自View,SurfaceView或 ...
- Android绘图机制(二)——自定义View绘制形, 圆形, 三角形, 扇形, 椭圆, 曲线,文字和图片的坐标讲解
Android绘图机制(二)--自定义View绘制形, 圆形, 三角形, 扇形, 椭圆, 曲线,文字和图片的坐标讲解 我们要想画好一些炫酷的View,首先我们得知道怎么去画一些基础的图案,比如矩形,圆 ...
最新文章
- win7修改网络计算机名字,小编分析win7系统修改计算机名字的操作方法
- 又拍云再放大招,CDN同时支持HTTP/2和SPDY/3.1协议
- WPF Dispatcher介绍
- why some product does not have Note assignment block
- 2021年香河一中高考成绩查询,2021年廊坊高考状元名单公布,廊坊文理科状元是谁多少分...
- python爬虫新浪新闻_学习了《python网络爬虫实战》第一个爬虫,爬取新浪新闻
- linux驱动编写(字符设备编写框架)
- NodeJs局域网开启服务
- 机器人能力再进化,组装宜家椅子只需20分钟! | Science Robotics论文
- MTV模型—urls和view
- ffmpeg解码器使用
- php redis入门指南,redis入门指南(四)—— redis如何节省空间
- 【采用】社交网络分析与金融反欺诈应用(知识图谱?)
- 视频倒立解决方法/USB 视频设备ID:USB\VID_13D3PID_5130MI_00\621DA5E0900000
- 什么是JSX、是如何使用以及注意事项
- html实现太极图效果
- Android SDK使用迅雷下载方法
- SCI论文写作高频词汇短语汇总
- 疫情危机中看待业务韧性
- 派森编程python_派森(Python)编程有什么用?
热门文章
- php 获取请求设备,php – 如何获取设备令牌
- air java,Java Bean
- 学维修电脑要多久_学厨师要多久才出师
- python斐波那契数列前20项_兔子繁殖问题带来的智商碾压:斐波那契数列趣谈
- vector 删除指定元素_std::vector简介
- android size_t在哪个头文件,size_t
- java左上角图标太小_Eclipse在高分屏下图标过小的解决方法
- C语言 | 变量的存储方式
- 【lua学习】3.字符串
- android照片备份软件下载,照片备份云相册app下载-照片备份云相册下载V1.9安卓版-西西软件下载...