前言首先祝大家国庆快乐,玩得开心;1.Android坐标系详解。Android坐标系实际上是一个三维坐标系,Z轴向上,X轴向右,Y轴向下。对这些三维坐标进行点处理,可以构成丰富的Android界面或动画效果;1.Android屏幕一些值的获取①获取屏幕区域的宽高获取DisplayMetricsmetrics=newDisplayMetrics();getWindowManager().getDefaultDisplay().getMetrics(metrics);intwidthPixels=metrics.widthPixels;intheightPixels=metrics.heightPixels;②App区域宽高getRectrect=newRect();getWindow().getDecorView().getWindowVisibleDisplayFrame(rect);③获取状态栏高度Rectrect=newRect();getWindow().getDecorView()。getWindowVisibleDisplayFrame(rect);intstatusBarHeight=rectangle.top;④视图布局区域宽高2、AndroidView绝对相对坐标系View的静态坐标方法getLeft():返回View自身左侧到父布局左侧的距离;getTop():返回View自身上边缘到父布局上边缘的距离;getRight():返回View自身右侧到父布局左侧的距离;getBottom():返回View自身下边缘到父布局上边缘的距离;getX():返回值为getLeft()+getTranslationX(),当setTranslationX()getLeft()不变时,getX()改变;getY():返回值为getTop()+getTranslationY(),当setTranslationY()getTop()不变时,getY()发生变化;3.MotionEvent提供了当手指触摸到屏幕时的一些方法getX():当前触摸事件与当前View左侧的距离getY():当前触摸事件与当前View上边缘的距离getRawX():当前触摸事件与整个屏幕左侧的距离getRawY():当前触摸事件与整个屏幕左侧的距离整个屏幕的上边缘4.视图宽高方法getWidth()布局后有效,返回值为mRight-mLeft;getHeight()布局后有效,返回值为mBottom-mTop;getMeasuredWidth()返回测量过程中得到的mMeasuredWidth值;getMeasuredHeight()返回测量过程中得到的mMeasuredHeight值;5、AndroidView滑动相关坐标系View的滑动方法offsetLeftAndRight(intoffset)|水平移动View,offset为正则x轴向前移动,整个View移动,getLeft()会发生变化,自定义View为很有用;offsetTopAndBottom(intoffset)|垂直方向移动View,offset是y轴正向移动,整个View移动,getTop()会改变,自定义View很有用;scrollTo(intx,inty)|滚动View中的内容(不是整个View)滑动到对应位置,参考坐标原点为ParentView的左上角,x和y有规律的往里移动xy轴方向相反,反之亦然;滚动(intx,inty)|基于scrollTo()在xy上继续滑动setScrollX(intvalue)|本质是scrollTo(),只是改变了Y轴滑动。setScrollY(intvalue)|本质是scrollTo(),只是改变X轴滑动。getScrollX()/getScrollY()|获取当前滑动位置偏移量。很多人可能会对AndroidView的scrollBy()和scrollTo()参数传递正数但向坐标系的负方向移动,甚至死记硬背的特性产生疑惑。这里简单给出这个特性的真正原因——源码分析,如下:=x;mScrollY=y;invalidateParentCaches();onScrollChanged(mScrollX,mScrollY,oldX,oldY);if(!awakenScrollBars()){postInvalidateOnAnimation();}}}View对这个方法的评论明确指出它会触发onScrollChanged()和invalidated()方法,所以我们将注意力转向invalidated()方法触发的draw()过程,最终会在draw()过程中触发下面的invalidate()方法,如下:publicvoidinvalidate(intl,intt,intr,intb){finalintscrollX=mScrollX;finalintscrollY=mScrollY;//滚动时参数和坐标反转的真正原因invalidateInternal(l-scrollX,t-scrollY,r-scrollX,b-scrollY,true,false);}核心在这里scrollTo()和scrollBy()方法要特别注意:如果你为一个Vi调用scrollTo()方法ewGroup滚动ViewGroup中的内容,如果要滚动一个ViewGroup,那么为它嵌套一个外层,滚动外层总结view获取自己的坐标:getLeft(),getTop(),getRight(),getBottom()view获取自己的宽高:getHeight(),getWidth()motionEvent获取坐标:getX(),getY(),getRawX(),getRawY()然后motionEvent的方法:getX():获取点击事件相对于控件左侧的x轴坐标,即点击事件与控件左侧的距离:获取点击事件相对的x轴坐标到整个屏幕的左侧,即点击事件距离整个屏幕左侧的距离getRawY():获取点击事件相对于整个屏幕上边缘的y轴坐标,即点击事件到整个屏幕上边缘的距离
