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相关推荐

  1. Android进阶之光读书笔记——第三章:View体系与自定义View

    第三章 View体系与自定义View 本章将介绍Android中十分重要的View,在多本书中View是必讲的一节,Android群英传就讲了不少的View的知识,那么在这里我们再去复习一遍吧 3.1 ...

  2. View体系与自定义View(三)—— View的事件分发机制

    1. 分析Activity的构成 一个Activity包含一个Window对象,这个对象是由PhoneWindow来实现的.PhoneWindow将DecorView作为整个应用窗口的根View. 而 ...

  3. Android仿IOS解锁密码界面-自定义view系列(6)

    Android仿IOS解锁密码界面-自定义view系列 功能简介 主要实现步骤-具体内容看github项目里的代码 xml相关属性设置 Android Studio 代码 Android技术生活交流 ...

  4. Android安卓仿IOS音量调节-自定义view系列(4)

    Android安卓仿IOS音量调节-自定义view系列 功能简介 主要实现步骤 xml相关属性设置 java代码 Android技术生活交流 更多其他页面-自定义View-实用功能合集:点击查看 Gi ...

  5. Android开发之制作圆形头像自定义View,直接引用工具类,加快开发速度。带有源代码学习

    作者:程序员小冰,CSDN博客:http://blog.csdn.net/qq_21376985 QQ986945193 博客园主页:http://www.cnblogs.com/mcxiaobing ...

  6. Android开发之制作圆形头像自定义View,直接引用工具类,加快开发速度。带有源代码学习...

    作者:程序员小冰,CSDN博客:http://blog.csdn.net/qq_21376985 QQ986945193 博客园主页:http://www.cnblogs.com/mcxiaobing ...

  7. Android绘图机制(三)——自定义View的实现方式以及半弧圆新控件

    Android绘图机制(三)--自定义View的三种实现方式以及实战项目操作 在Android绘图机制(一)--自定义View的基础属性和方法 里说过,实现自定义View有三种方式,分别是 1.对现有 ...

  8. Android自定义view原理及自定义View示例

    自定义view如何分类 自定义View:只需要重写onMeasure()和onDraw(),在没有现成的View,需要自己实现的时候,就使用自定义View,一般继承自View,SurfaceView或 ...

  9. Android绘图机制(二)——自定义View绘制形, 圆形, 三角形, 扇形, 椭圆, 曲线,文字和图片的坐标讲解

    Android绘图机制(二)--自定义View绘制形, 圆形, 三角形, 扇形, 椭圆, 曲线,文字和图片的坐标讲解 我们要想画好一些炫酷的View,首先我们得知道怎么去画一些基础的图案,比如矩形,圆 ...

最新文章

  1. win7修改网络计算机名字,小编分析win7系统修改计算机名字的操作方法
  2. 又拍云再放大招,CDN同时支持HTTP/2和SPDY/3.1协议
  3. WPF Dispatcher介绍
  4. why some product does not have Note assignment block
  5. 2021年香河一中高考成绩查询,2021年廊坊高考状元名单公布,廊坊文理科状元是谁多少分...
  6. python爬虫新浪新闻_学习了《python网络爬虫实战》第一个爬虫,爬取新浪新闻
  7. linux驱动编写(字符设备编写框架)
  8. NodeJs局域网开启服务
  9. 机器人能力再进化,组装宜家椅子只需20分钟! | Science Robotics论文
  10. MTV模型—urls和view
  11. ffmpeg解码器使用
  12. php redis入门指南,redis入门指南(四)—— redis如何节省空间
  13. 【采用】社交网络分析与金融反欺诈应用(知识图谱?)
  14. 视频倒立解决方法/USB 视频设备ID:USB\VID_13D3PID_5130MI_00\621DA5E0900000
  15. 什么是JSX、是如何使用以及注意事项
  16. html实现太极图效果
  17. Android SDK使用迅雷下载方法
  18. SCI论文写作高频词汇短语汇总
  19. 疫情危机中看待业务韧性
  20. 派森编程python_派森(Python)编程有什么用?

热门文章

  1. php 获取请求设备,php – 如何获取设备令牌
  2. air java,Java Bean
  3. 学维修电脑要多久_学厨师要多久才出师
  4. python斐波那契数列前20项_兔子繁殖问题带来的智商碾压:斐波那契数列趣谈
  5. vector 删除指定元素_std::vector简介
  6. android size_t在哪个头文件,size_t
  7. java左上角图标太小_Eclipse在高分屏下图标过小的解决方法
  8. C语言 | 变量的存储方式
  9. 【lua学习】3.字符串
  10. android照片备份软件下载,照片备份云相册app下载-照片备份云相册下载V1.9安卓版-西西软件下载...