├── .gitattributes ├── .gitignore ├── README.md ├── view坐标系(一).md └── view滑动(二).md /.gitattributes: -------------------------------------------------------------------------------- 1 | # Auto detect text files and perform LF normalization 2 | * text=auto 3 | 4 | # Custom for Visual Studio 5 | *.cs diff=csharp 6 | 7 | # Standard to msysgit 8 | *.doc diff=astextplain 9 | *.DOC diff=astextplain 10 | *.docx diff=astextplain 11 | *.DOCX diff=astextplain 12 | *.dot diff=astextplain 13 | *.DOT diff=astextplain 14 | *.pdf diff=astextplain 15 | *.PDF diff=astextplain 16 | *.rtf diff=astextplain 17 | *.RTF diff=astextplain 18 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Windows image file caches 2 | Thumbs.db 3 | ehthumbs.db 4 | 5 | # Folder config file 6 | Desktop.ini 7 | 8 | # Recycle Bin used on file shares 9 | $RECYCLE.BIN/ 10 | 11 | # Windows Installer files 12 | *.cab 13 | *.msi 14 | *.msm 15 | *.msp 16 | 17 | # Windows shortcuts 18 | *.lnk 19 | 20 | # ========================= 21 | # Operating System Files 22 | # ========================= 23 | 24 | # OSX 25 | # ========================= 26 | 27 | .DS_Store 28 | .AppleDouble 29 | .LSOverride 30 | 31 | # Thumbnails 32 | ._* 33 | 34 | # Files that might appear in the root of a volume 35 | .DocumentRevisions-V100 36 | .fseventsd 37 | .Spotlight-V100 38 | .TemporaryItems 39 | .Trashes 40 | .VolumeIcon.icns 41 | 42 | # Directories potentially created on remote AFP share 43 | .AppleDB 44 | .AppleDesktop 45 | Network Trash Folder 46 | Temporary Items 47 | .apdisk 48 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | 来自 [https://github.com/JunWeiUp/view](https://github.com/JunWeiUp/view) 2 | 3 | # view 系列 4 | view的使用 5 | 开始 ,view可以说是非常重要的,现在很多开发者只会去用,很难知道为什么要去这么做,一旦出了问题就Stack Overflow一下 , 6 | 这种程序员就是面向Stack Overflow编程 哈哈,好了 ,今天开始我会分几篇文章给大家讲解View的大部分基本原理。 7 | 当你遇到嵌套,触摸冲突,自定义动画效果就不会害怕啦,这也是证明你通向Android高级开发工程师的第一步。 8 | 9 | 10 | ##目录 11 | 12 | ###[view坐标系(一)](https://github.com/JunWeiUp/view/blob/master/view%E5%9D%90%E6%A0%87%E7%B3%BB(%E4%B8%80).md) 13 | 14 | 15 | ###[view滑动(二)](https://github.com/JunWeiUp/view/blob/master/view%E6%BB%91%E5%8A%A8(%E4%BA%8C).md) 16 | 17 |

18 |

19 |

20 | 21 | - 如有问题可以issues -------------------------------------------------------------------------------- /view坐标系(一).md: -------------------------------------------------------------------------------- 1 | 来自 [https://github.com/JunWeiUp/view](https://github.com/JunWeiUp/view) 2 | 3 | 微博上有幸认识了GcsSloop,并给我提了非常好的意见,以后文章的干货一点会更多! 4 | 5 | 赫赫,好了该说正题了,view可以说是非常重要的,现在很多开发者只会去用,很难知道为什么要去这么做,一旦出了问题就Stack Overflow一下,这种程序员就是面向Stack Overflow编程 哈哈,好了 ,今天开始我会分几篇文章给大家讲解View的大部分基本原理。当你遇到嵌套,触摸冲突,自定义动画效果就不会害怕啦,这也是证明你通向Android高级开发工程师的第一步。 6 | 7 | AndroidView体系是界面的核心,在这个系列中我分为多个章节陆续讲到 View坐标系、View的滑动机制、View的事件分发机制 、View的绘制流程 等等 来介绍Android View体系。 我们从最基础的坐标系开始! 8 | 9 | 1.View介绍 10 | 11 | View是Android所有控件的基类,而且ViewGroup也是继承View的,下站图可以让大家更加直观的让大家了解View的体系. 12 | ![](http://upload-images.jianshu.io/upload_images/489570-631e06fb624c34b9.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) 13 | 14 | 15 | 2.坐标系 16 | 17 | Android中分为两种Android坐标系和视图坐标系 18 | 19 | (-) Android坐标系 20 | 21 | Android坐标系还是比较简单的, 将屏幕的左上角的顶点作为Android坐标系的原点,这个原点向右是X轴正方向,原点向下是Y轴正方向。 22 | 23 | 还是看图比较直观:(虽然是我百度的哈哈) 24 | ![](http://upload-images.jianshu.io/upload_images/489570-7430da1a80125cf4.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) 25 | 26 | 27 | 在MotionEvent中的getRawX()和getRawY()获取的坐标都是Android坐标系的坐标。 28 | 29 | (二)视图坐标系 30 | 31 | 顾名思义 Android的屏幕是有限的 ,有时候view会很大,我们通过屏幕能看到的View大小称为视图, 32 | 33 | 我们还是直接看图吧!(哈哈) 34 | 35 | ![](http://upload-images.jianshu.io/upload_images/489570-7cc507c5f1cf433f.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) 36 | 37 | 38 | View自身坐标 39 | 如下方法可以获得View到其父控件(ViewGroup)的距离: 40 | 41 | getTop():获取View自身顶边到其父布局顶边的距离 42 | 43 | getLeft():获取View自身左边到其父布局左边的距离 44 | 45 | getRight():获取View自身右边到其父布局左边的距离 46 | 47 | getBottom():获取View自身底边到其父布局顶边的距离 48 | MotionEvent提供的方法 49 | getX():获取点击事件距离控件左边的距离,即视图坐标 50 | 51 | getY():获取点击事件距离控件顶边的距离,即视图坐标 52 | 53 | getRawX():获取点击事件距离整个屏幕左边距离,即绝对坐标 54 | 55 | getRawY():获取点击事件距离整个屏幕顶边的的距离,即绝对坐标 56 | 今天就写到这里 ,如果那里有不明白的可以直接在评论回复! 57 | 58 | 祝大家过一个好的 5.1! -------------------------------------------------------------------------------- /view滑动(二).md: -------------------------------------------------------------------------------- 1 | 来自 [https://github.com/JunWeiUp/view](https://github.com/JunWeiUp/view) 2 | #前言 3 | view的滑动是Android自定义控件的基础内容,我们在开发过程中难免会遇到view的滑动问题, 4 | 实现view的滑动有很多种方式,给大家讲几个基本的滑动方法 5 | 6 | #view的滑动 7 | ##1.layout() 8 | view中会调用onLayout()方法来摆放位置,我们也可以直接用onLayout的left、top、right、bottom这四种属性来控制View的位置。比如我们自定义一个View,在onTouchEvent()方法中获取触摸点的坐标,放入onlayout()中,这样就可以实现随着触摸的位置变化而滑动,如图: 9 | 10 | ... 11 | public boolean onTouchEvent(MotionEvent event) { 12 | //获取到手指处的横坐标和纵坐标 13 | int x = (int) event.getX(); 14 | int y = (int) event.getY(); 15 | 16 | switch (event.getAction()) { 17 | case MotionEvent.ACTION_DOWN: 18 | lastX = x; 19 | lastY = y; 20 | break; 21 | case MotionEvent.ACTION_MOVE: 22 | //计算移动的距离 23 | int offsetX = x - lastX; 24 | int offsetY = y - lastY; 25 | //调用layout方法来重新放置它的位置 26 | layout(getLeft()+offsetX, getTop()+offsetY, 27 | getRight()+offsetX , getBottom()+offsetY); 28 | break; 29 | ... 30 | } 31 | ... 32 | 33 | ##2.也可以通过offsetLeftAndRight()和offsetTopAndBottom()方法 34 | 这个和onlayout大致相同,只不过这个方法传入的是偏移量,我就直接放代码啦 35 | 36 | case MotionEvent.ACTION_MOVE: 37 | //计算移动的距离 38 | int offsetX = x - lastX; 39 | int offsetY = y - lastY; 40 | //对left和right进行偏移 41 | offsetLeftAndRight(offsetX); 42 | //对top和bottom进行偏移 43 | offsetTopAndBottom(offsetY); 44 | break; 45 | 46 | ##3.LayoutParams(通过改变参数达到滑动的目的) 47 | LayoutParams中保存了view的布局参数,我们通过不短的改变view参数,从而达到滑动的目的, 48 | 比如我们想实现viewpage 两个条目切换的时候下面有有一个滑动的滑条那么就可以用这种方式 49 | ![Paste_Image.png](http://upload-images.jianshu.io/upload_images/1507947-7fa3d90e2ff0b279.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) 50 | 51 | indicatorLine.post(new Runnable() { 52 | @Override 53 | public void run() { 54 | indicatorLine.measure(0, 0); 55 | int indicatorLineWidth = indicatorLine.getMeasuredWidth(); 56 | originalIndicatorLineLeftMargin = rightTitleMarginLeft + 57 | (float) leftTitleWidth / 2 - (float) DimenUtil.dip2px(IntentionMajorActivity.this, 65) / 2 - textDistence; 58 | indicatorLineLayoutParams.leftMargin = (int) originalIndicatorLineLeftMargin; 59 | indicatorLine.setLayoutParams(indicatorLineLayoutParams); 60 | } 61 | }); 62 | } 63 | 64 | ##4.scollTo与scollBy 65 | scollTo(x,y)表示移动到某个具体的坐标点,而scollBy(dx,dy)则表示移动的增量为dx、dy。其实scollBy最终也是要调用scollTo的。scollTo、scollBy移动的是View的内容,如果在ViewGroup中使用则是移动他所有的子View。我们将ACTION_MOVE中的代码替换成如下代码: 66 | 67 | ((View)getParent()).scrollBy(-offsetX,-offsetY); 68 | 69 | 如果我们要让view随着手指的触摸方向移动我们就要把偏移量设为负值 70 | 71 | #后言 72 | 73 | 还有一种滑动方式那就是通过动画的方式进行滑动,那么不在今天讲述的范围, 74 | 由于本人水平有限,某些地方可能存在误解或不准确,如果你对此有疑问可以[gitHub](https://github.com/JunWeiUp/view)上提交issues进行反馈。 75 | 76 | 77 | 参考自: 78 | 79 | - http://blog.csdn.net/itachi85/article/details/50724558 80 | - http://www.linuxidc.com/Linux/2015-11/125390.htm --------------------------------------------------------------------------------