http://blog.csdn.net/zhangweixing0/article/details/9064049
http://blog.csdn.net/zhangweixing0/article/details/9064049
http://blog.csdn.net/zhangweixing0/article/details/9064049
http://blog.csdn.net/zhangweixing0/article/details/9064049
http://blog.csdn.net/zhangweixing0/article/details/9064049
整个坐标系是以手机屏幕左上角为原点(0,0),如果在屏幕没有滑动之前,这一理解肯定是ok的,但在滑屏之后,就会产生很多歧义和混淆,原因在于使用过程当中,很多方法的参数并非是参照屏幕,而是相对于父视图,对这整个过程和后面自定义控件的坐标变化带来的各个参数变化来说理解起来就并不那么适合了,最开始给人的感觉是越来越不清楚这个坐标该怎么设置,好像坐标系总在发生变化,后来才慢慢在思维当中构建起视图与视图容器以及屏幕之间的关系。
android.view.View.layout(int l, int t, int r, int b) layout的过程就是确定View在屏幕上显示的具体位置,在代码中就是设置其成员变量mLeft,mTop,mRight,mBottom的值,这几个值构成的矩形区域就是该View显示的位置, 不过这里的具体位置都是相对与父视图的位置 。 mLeft代表当前view.layout的这个view的左边缘离它的父视图左边缘的距离,拿上面“子视图2.layout(int l, int t, int r, int b) ”来说,它的父视图便是子视图1,2,3合起来形成的整个大矩形,那么这里将父视图的左上角定为(0,0),那么可以确定mLeft为一个子视图宽度320,以此类推, mTop指当前view的上边缘离父视图上边缘的距离。而以此为界, mRight所指的是 当前view的右边缘离父视图左边缘的距离 ,一眼可以看出值为640(mLeft+自己的宽度),mBottom也是指当前view的下边缘离父视图的上边缘的距离。至于为何如此,大概是因为坐标系的缘故,坐标中的任何点都必须以(0,0)为起点,XY轴为衡量。
视图左侧位置 view.getLeft()
视图右侧位置 view.getRight()
视图顶部位置 view.getTop();
视图底部位置 view.getBottom();
这四个方法所获取到的各个左上右下的值与layout的四个参数代表的是一样的,都是相对父视图的左边缘与上边缘。
视图宽度 view.getWidth();
视图高度 view.getHeight() ;
这两个方法获取的是该view的高和宽,仅仅在滑动的情况下,或者说该view的大小如果不发生变化,它的值是不会变的。
getMeasuredWidth();
getMeasuredHeight();
说到这里就不得不提getWidth()、getHeight()和getMeasuredWidth()、getMeasuredHeight()这两对函数之间的区别,getMeasuredWidth()、getMeasuredHeight()返回的是measure过程得到的mMeasuredWidth和mMeasuredHeight的值,而getWidth()和getHeight()返回的是mRight - mLeft和mBottom - mTop的值。 一般情况下layout过程会参考measure过程中计算得到的mMeasuredWidth和mMeasuredHeight来安排子视图在父视图中显示的位置,但这不是必须的,measure过程得到的结果可能完全没有实际用处,特别是对于一些自定义的ViewGroup,其子视图的个数、位置和大小都是固定的,这时候我们可以忽略整个measure过程,只在layout函数中传入的4个参数来安排每个子视图的具体位置。
view.getX();
view.getY();
getX和getY获取到的值为相对于 父视图而言的两个左边缘和上边缘的距离。
view.getLocationOnScreen(location); 该方法可以获取到当前view与 屏幕 的关系,location(0)代表X值,表示该view的左边缘与屏幕的左边缘之间的距离。可以想象,当滑屏产生,view开始移动该值肯定会改变的。 location(1)代表Y值,表示该view的上边缘与屏幕的上边缘之间的距离,该距离肯定是包含标题栏的高度的。
getLocationInWindow();
ps:View.getLocationInWindow()和 View.getLocationOnScreen()在window占据全部screen时,返回值相同,不同的典型情况是在Dialog中时。当Dialog出现在屏幕中间时,View.getLocationOnScreen()取得的值要比View.getLocationInWindow()取得的值要大。
VelocityTracker.getXVelocity() 指滑动速度包括速率和方向两个方面,往左滑动小于0,值为负;往右滑动大于0,值为正。
view.scrollTo (x,y) 将整个 父视图的左上角定为(0,0),再移动这个 屏幕 的左上角到父视图的点(x,y)处,注意此处的x和y是根据父视图的坐标系来定的。
view.scrollBy(x,y) x代表横向移动的距离,y代表纵向移动的距离
view.getScrollX
view.getScrollY
将整个父视图的左上角定为(0,0),那么子view. getScrollX会获取到屏幕左边缘减去父视图的左边缘为0的距离,特别当滑屏时,父视图会被迫隐藏一部分,因为屏幕的大小是固定的。 getScrollY以此类推。
event.getX()
event.getY()
该方法是不受视图影响的,X和Y的值仅仅代表手指在以左上角(0,0)为原点的屏幕触摸点的坐标值。
Scroller.getCurrY()
Scroller.getCurrX()
该方法拿横轴来说,代表屏幕的左边缘离父视图的左边缘的距离。
Scroller.startScroll( int startX, int startY, int dx, int dy)
四个参数分别表示起点的坐标和滑动的向量,即从( startX, startY)开始滑动,横向滑动dx的距离,纵向滑动dy的距离(正值向左滑,负值向右滑),而这里的 startX, startY又是参照的父视图左上角为原点坐标的坐标系,滑屏时经常使用getScrollX()和 getScrollY()来代表屏幕左边缘和上边缘处于父视图坐标系的具体位置
TranslateAnimation()
参数参照:http://blog.sina.com.cn/s/blog_90b91bf10101ai3e.html
以上是在做滑屏控件经常用到的方法,一方面需要了解layout和measure的基本流程,更重要一方面,当你想要实现某一个效果的时候,比如slidingmenu那样的控件,查看源码我们可以知道它是继承的ViewGroup,该怎样入手去做呢。
首先,需要了解它的父视图是什么,slidingmenu为例,打开程序,第一眼,是一个很普通的视图页面,当向右滑动手指,这个视图页面开始向右边移动,而从左边会慢慢移出来另一部分视图,看上去像是抽出来的或者是隐藏的,事实上抛开阴影效果来讲,想象手机屏幕的左边有一部分我们看不到的视图,它就是这个被抽出来的menu视图了。概括来说,一个主view,一个menu其实是并排于一个大视图上面的。
找到了父视图,接下来就好办了,认定这个父视图的宽度就是主view的宽度和menu的宽度之和(暂不考虑padding之类),高度就是屏幕的高度,那么在思维当中这个二维平面就产生了,将它想成一张纸,然后对准主view将这张纸贴到手机屏幕上,左右滑动,会看到其实slidingmenu也就是这么个效果。
然后,实现的思路会清晰很多。定义这个父视图为myview继承viewgroup,原因在于尽管主view和menu并排在一个大view下,但毕竟两者的内容不同,后面需要放进不同的控件处理不同的事件,这个父视图内包含着两个view,到时候处理起来会方便很多,setcontentview为这个父视图,那么打开程序的第一眼就会看到它。再定义这两个view设置好两个内容布局,并将它们addview添加到myview当中。外部工作基本就完成了,可以呈现父视图,并且父视图内有两个子view。
接下来,需要去完善一些细节,父视图内的子view该如何放置,这是关乎成败的一环,也就是如何将这张纸贴到我们希望的位置,这时就是onlayout的处理了,处理好屏幕,父视图子view之间的位置关系,通过各自的layout参数设置来摆放妥当各个view,比如开始的时候menu是隐藏的,这个就是通过位置的摆放设置的,然后它是从左边滑出来的,说明它处于父视图的左边位置,而主view处于相对右边的位置,而屏幕刚好也处于父视图右边的位置,恰好能看到主view的全貌,在脑海里如果能有清晰的画面出现,实现起来就会轻松很多。当实现了这个摆放,就可以理解menudrawer里面上下左右都可以滑出menu的结构了。
最后,便是滑动效果,请相信这样的控件里面,任何处理肯定都会和view位置的摆放扯上关系,滑动方向,滑动距离等等都涉及到坐标的处理。这也是为何上面列出那些常用的获取view坐标的方法。
总结下来,构建类似这样的控件,也就这三点,明确父子视图和屏幕的关系,通过坐标和位置参数设置它们的关系,处理这些关系发生变化的情况。
当然,事实上slidingmenu远远没这么简单,其中为了方便后续开发,它内置了很多接口和处理,大多数都是位置坐标和事件监听相关联,而万变不离其宗的是,它也肯定有这三个方面的构建,理解了这些基本的东西,尝试做一些自己想象的效果,对自定义的理解来说,进步会非常大。
移动开发] Android 屏幕(View)坐标系统 |
首先明确一下 android中的坐标系统 :屏幕的左上角是坐标系统原点(0,0),原点向右延伸是X轴正方向,原点向下延伸是Y轴正方向。
一、View的坐标
需要注意view的坐标是相对父容器而言的,包括:getTop()、getBottom(),getLeft(),getRight()。以getTop为例,函数源代码为:
/**
* Top position of this view relative to its parent.
*相对应父控件的top位置,单位为像素,即头部到父控件的距离
* @return The top of this view, in pixels.
*/
@ViewDebug.CapturedViewProperty
public final int getTop() {
return mTop;
}
图示1:
![](http://blog.csdn.net/wangjinyu501/article/details/21827341/file:/C:/Users/ADMINI~1/AppData/Local/Temp/enhtmlclip/Image.png)
图示2:
1、视图左侧位置 view.getLeft()
2、视图右侧位置 view.getRight()
3、视图顶部位置 view.getTop();
4、视图底部位置 view.getBottom();
5、 视图宽度 view.getWidth();
6、视图高度 view.getHeight()
二、MotionEvent类中 getRowX()和 getX()
1、event.getRowX():触摸点相对于屏幕原点的x坐标
2、event.getX(): 触摸点相对于其所在组件原点的x坐标
图示
更多
getLocationInWindow
getLeft
如果在Activity的OnCreate()事件输出那些参数,是全为0,要等UI控件都加载完了才能获取到这些。
6 android图像处理系列之三--图片色调饱和度、色相、亮度处理
9 android图像处理系列之六--给图片添加边框(下)-图片叠加
(24)Android学习笔记之颜色处理(ColorMtrix)
(25)Java图像渐变
1 在activity中通过Intent调用Browser打开指定的网页
startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("http://androidit.diandian.com")));
2 彻底关闭程序进程
System.exit(0)和android.os.Process.killProcess(android.os.Process.myPid())可以结束当前activity,但是还是会被ActivityManager接冠涞回到前一个activity(哪怕是前一个activity并没有被关闭也会重新oncreate)。
如下:
@Override
protected void onDestroy()
而想要彻底关闭程序进程可采用下面的方法:
android2.2及以前的版本:
ActivityManager manager = (ActivityManager)getSystemService(ACTIVITY_SERVICE);
manager.restartPackage(getPackageName());
//需要声明权限
android2.2及其以后的版本:
ActivityManager am = (ActivityManager) getSystemService(ACTIVITY_SERVICE);
am.killBackgroundProcesses(getPackageName());
//需要声明权限
以上两种都是通过结束包的方法结束相关的程序进程。
3 取得android SDK版本的方法
Integer.valueOf(android.os.Build.VERSION.SDK)
4 修改android默认标题属性
requestWindowFeature(Window.FEATURE_CUSTOM_TITLE);
setContentView(R.layout.custom_title);
getWindow().setFeatureInt(Window.FEATURE_CUSTOM_TITLE R.layout.custom_title_1);
5 android设置view透明度的效果
在xml文件中设置背景颜色:
android:background=“#ff6495ED”
注:前两位表示透明度,后面依次为RGB,透明度从0到255,0为完全透明,255为不透明。
在java文件中获取该控件的Drawable,设置透明度:
convertView.getBackground().setAlpha(80);
直接设置透明度:
setAlpha(80)
6 android字体的设定
Android系统默认支持三种字体,分别为:“sans” “serif” “monospace“,也可以引入其他字体:
示例如下:
使用默认的sans字体–>
android:typeface="sans"
使用默认的serifs字体–>
android:typeface="
serifs"
使用默认的monospace字体–>
android:typeface="
monospace"
这里没有设定字体,我们将在Java代码中设定–>
java代码:
TextView textView = (TextView)findViewById(R.id.custom);
//将字体文件保存在assets/fonts/目录下,创建Typeface对象
Typeface typeFace = Typeface.createFromAsset(getAssets() “fonts/HandmadeTypewriter.ttf”);
//应用字体
textView.setTypeface(typeFace);
7 android字体宽度高度的获得
TextView textView = (TextView)findViewById(R.id.custom);
Typeface typeFace = textView.getTypeface();
float fontSize = textView.getTextSize();
Rect rect = new Rect();
Paint p = new Paint();
p.setTypeface(typeFace);
p.setTextSize(fontSize);
p.getTextBounds("1" 0 1 rect);
int textWidth = rect.width();
int textHeight = rect.height();
8 android获得状态栏尺寸和标题栏尺寸
获取状态栏高度:
decorView是window中的最顶层view,可以从window中获取到decorView,然后decorView有个getWindowVisibleDisplayframe方法可以获取到程序显示的区域,包括标题栏,但不包括状态栏。
于是,我们就可以算出状态栏的高度了。
Rect frame = new Rect();
getWindow().getDecorView().getWindowVisibleDisplayframe(frame);
int statusBarHeight = frame.top;
获取标题栏高度:
int contentTop = getWindow().findViewById(Window.ID_ANDROID_CONTENT).getTop();
//getWindow().findViewById(Window.ID_ANDROID_CONTENT)这个方法获取到的view就是程序不包括标题栏的部分,然后就可以知道标题栏的高度了。
//statusBarHeight是上面所求的状态栏的高度
int titleBarHeight = contentTop - statusBarHeight
注:以上代码,如果在oncreate执行,所得值均为0,因为oncreate状态下,系统view并没有出来。
史上最全!最经典!最无私的Android资料(书籍+代码)分享-不要积分
Android 贪吃蛇、俄罗斯方块、中国象棋等100多个应用功能实例源码
android开发资料大集合
Android开发资料分享- 免积分(升级版)
Android 近百个项目的源代码,覆盖Android开发的每个领域
贡献15本pdf版经典Android教程,很值得看
android新手入门资料无私奉献(无需积分下载)
android系统源代码分析电子书
✿开发经验分享
openssl移植Android使用及其相关经验分享
Emoji表情符号兼容方案(适用ios,android,wp等平台)
go的滚咕噜咕噜滚和点心的龙卷风的实现原理
10种技巧可提升Android应用运行效果
个人开发总结分享:Android学习及如何利用android来赚钱
开发者总结
Android实现人物在地图中移动
Android蓝牙开发浅析
使用achartengine画线性。柱状图
让你的android程序调用c/c++库文件(windows平台)
共享android模拟真实书籍翻页效果(附源码)
为launcher添加仿HTC的preview(开源,附源码)
界面嵌入有米广告
仿Siri的中文语音助理源码
多点手势识别的实现
Android歌词秀1.5版(原创+源码奉献)
Android原理揭秘系列之View、ViewGroup
分享代码调试log追踪工具的使用方法
android json 轻量级的数据交换格式
Android原理揭秘系列之VacantCell缓存
Android仿iphone滚轮控件效果
✿常见问题
如何读取android设备的子网掩码和默认网关
大牛们如何读源码
在ViewFlipper中,在2个显示ListView的layout之间进行左右滑动,该如何处理
一个Activity中的多个View怎么切换
SurfaceView屏幕闪烁与双缓冲
我的程序为什么不能访问“/data"目录?
ANR的log如何分析才能快速找到问题的原因?
✿中文API
Android 中文API合集
✿android博客专栏推荐
应用类:
Android 开发从零开始
Android 天天向上
Android 开发高手进阶
游戏类:
Android 游戏开发专栏
Android 软件与游戏开发
系统类:
老罗的Android之旅(主讲系统源码分析)
这仅仅是一小部分,欢迎大家补充, 随时更新,分享利人利己,共同进步!