android view学习(一)
2016-03-16 16:11
561 查看
View是android中所有控件的基类,不管是简单的Button、TextView还是复杂的Listview或者其他的,他们的共同基类都是view。学习了《android开发艺术探索》,下面来简单总结一下view学习过程中容易混淆的一些概念以及应用。
View的继承关系
一、View的位置参数理解
View的位置友它的四个顶点来决定,分别对应于View的四个属性:top、left、right、bottom。以下四种位置属性都是基于父容器来讲的,因此是一种相对坐标。其中在android中,X轴和Y轴指的是右和下方向。
top: 左上角纵坐标 =getTop()
left: 左上角横坐标 =getLeft()
right: 右下角横坐标 =getRight()
bottom: 右下角纵坐标 =getBottom()
套用网上的一张图来解释说明一下:
http://blog.csdn.net/jason0539/article/details/42743531” title=”” />
注意:
从android3.0开始view新增了几个参数:x,y,translationX,translationY,其中,
x,y是view的左上角坐标,translationX,translationY 是View的左上角相对于父容器的偏移量,初始为0,对应换算关系为:
x=left+translationX
y=top+translationY
View在平移过程中,top和left代表的是原始左上角的位置信息,值是不会改变的,发生变化的是x,y,translationX,translationY这四个参数值。
二、View的事件处理
(1) MotionEvent
手指接触屏幕后产生的一系列事件中主要有:
ACTION_DOWN 手指刚接触屏幕,按下事件
ACTION_MOVE 手指在屏幕上移动,滑动事件
ACTION_UP 手指在屏幕上松开,松开手指事件
以上三种事件,我们可以通过MotionEvent对象可以获取到点击事件发生的x和y坐标。系统提供两组方法,getX()和getY(),getRawX()和getRawY()。其中:
getX()和getY() 表示当前view左上角的x和y的坐标
getRawX()和getRawY()表示相对于屏幕左上角的x和y坐标。
代码演示:
注意:
TouchSlop表示的是系统识别的被认为是滑动的最小距离,也就是说如果两次滑动之间的距离小于这个距离的话,系统就不会认为这是进行滑动,这是一个常量值,可以通过以下方式获取:
(2) VelocityTracker
速度计算,用于计算滑动过程中得速度,包含水平和竖直方向上的速度,再onTouchEvent中使用:
注意:
上面获取到的速度值有正有负,当我们从右向左滑动时就是负值,计算公式:
速度= (终点位置 - 起点位置) / 时间段
同时不需要使用的时候需要回收:
View的继承关系
public class View extends Object implements Drawable.Callback KeyEvent.Callback AccessibilityEventSource java.lang.Object ↳ android.view.View Known Direct Subclasses AnalogClock, ImageView, KeyboardView, MediaRouteButton, ProgressBar, Space, SurfaceView, TextView, TextureView, ViewGroup, ViewStub Known Indirect Subclasses AbsListView, AbsSeekBar, AbsSpinner, AbsoluteLayout, ActionMenuView, AdapterView<T extends Adapter>, AdapterViewAnimator, AdapterViewFlipper, and 103 others.
一、View的位置参数理解
View的位置友它的四个顶点来决定,分别对应于View的四个属性:top、left、right、bottom。以下四种位置属性都是基于父容器来讲的,因此是一种相对坐标。其中在android中,X轴和Y轴指的是右和下方向。
top: 左上角纵坐标 =getTop()
left: 左上角横坐标 =getLeft()
right: 右下角横坐标 =getRight()
bottom: 右下角纵坐标 =getBottom()
套用网上的一张图来解释说明一下:
http://blog.csdn.net/jason0539/article/details/42743531” title=”” />
注意:
从android3.0开始view新增了几个参数:x,y,translationX,translationY,其中,
x,y是view的左上角坐标,translationX,translationY 是View的左上角相对于父容器的偏移量,初始为0,对应换算关系为:
x=left+translationX
y=top+translationY
View在平移过程中,top和left代表的是原始左上角的位置信息,值是不会改变的,发生变化的是x,y,translationX,translationY这四个参数值。
二、View的事件处理
(1) MotionEvent
手指接触屏幕后产生的一系列事件中主要有:
ACTION_DOWN 手指刚接触屏幕,按下事件
ACTION_MOVE 手指在屏幕上移动,滑动事件
ACTION_UP 手指在屏幕上松开,松开手指事件
以上三种事件,我们可以通过MotionEvent对象可以获取到点击事件发生的x和y坐标。系统提供两组方法,getX()和getY(),getRawX()和getRawY()。其中:
getX()和getY() 表示当前view左上角的x和y的坐标
getRawX()和getRawY()表示相对于屏幕左上角的x和y坐标。
代码演示:
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".Act.MainActivity"> <com.ihidea.picturedemo.widget.MyView android:layout_width="200dp" android:layout_height="300dp" android:layout_centerInParent="true" android:background="#666fff"/> </RelativeLayout>
@Override public boolean onTouchEvent(MotionEvent event) { float tapX = event.getX(); float tapY = event.getY(); float tapRawX = event.getRawX(); float tapRawY = event.getRawY(); LogUtils.d("tapX:" + tapX + " tapY:" + tapY + " tapRawX:" + tapRawX + " tapRawY:" + tapRawY); return true; }
注意:
TouchSlop表示的是系统识别的被认为是滑动的最小距离,也就是说如果两次滑动之间的距离小于这个距离的话,系统就不会认为这是进行滑动,这是一个常量值,可以通过以下方式获取:
int tapDis = ViewConfiguration.get(this).getScaledTouchSlop(); LogUtils.d("滑动的最小距离:" + tapDis);
(2) VelocityTracker
速度计算,用于计算滑动过程中得速度,包含水平和竖直方向上的速度,再onTouchEvent中使用:
@Override public boolean onTouchEvent(MotionEvent event) { VelocityTracker velocityTracker = VelocityTracker.obtain(); velocityTracker.addMovement(event); //计算速度,设定时间间隔为1秒 velocityTracker.computeCurrentVelocity(1000); int xVelocity = (int) velocityTracker.getXVelocity(); int yVelocity = (int) velocityTracker.getYVelocity(); LogUtils.d("xVelocity:" + xVelocity + " yVelocity:" + yVelocity); return true; }
注意:
上面获取到的速度值有正有负,当我们从右向左滑动时就是负值,计算公式:
速度= (终点位置 - 起点位置) / 时间段
同时不需要使用的时候需要回收:
velocityTracker.clear(); velocityTracker.recycle();
相关文章推荐
- Ubuntu下 搭建Android5.1.1编译环境
- Android IPC进程通信之Messager方式
- android开发步步为营之96:android两种常用截图技术
- Android进程优先级architecture : low memory killer (/system/core/lmkd/lmkd.c)
- Android 单位转换(dp、sp、px)
- Android模仿表单上传文件
- android上传图片(及普通参数)到服务器(j2ee后台服务器,ssh框架)
- Android之判断手机是否联网
- Android-BaseLine框架初识之MVP模式最佳方案(三)
- android camera(二):摄像头工作原理、s5PV310 摄像头接口(CAMIF)
- android 一个页面内 多个listview的实现滑动显示
- Android下使用正则表达式
- Android之将对象转换json字符串
- Android消息推送1----原始的socket长链接
- Android之二维码的生成
- android中广播的使用(动态和静态注册)
- Android 颜色透明度
- 安卓TextView设置字体竖直排列
- Android自定义View流程
- android:name 的秘密