您的位置:首页 > 移动开发 > Android开发

android view学习(一)

2016-03-16 16:11 561 查看
View是android中所有控件的基类,不管是简单的Button、TextView还是复杂的Listview或者其他的,他们的共同基类都是view。学习了《android开发艺术探索》,下面来简单总结一下view学习过程中容易混淆的一些概念以及应用。

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();
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: