android -view基础

原创 2016年06月02日 11:45:48

3.1.2.view 的位置

view的位置主要由它的四个顶点来决定,分别对应于view的四个属性:top、left、right、bottom,

top:左上角纵坐标

left: 左上角横坐标

right:右下角横坐标

bottom:右下角纵坐标

这些坐标都是相对于view的父容器来说的:如图:

这里写图片描述

通过坐标很容易得出view的宽和高

width = right - left

height = bottom-top

关于view的一些属性的获取与含义

left = getLeft();

right = getRight();

top = getTop();

bottom = getBottom();

android 3.0后额外的属性x,y ,translationX,translationY
x,y:是view左上角的坐标
translationX,translationY:是View左上角相对于父容器的偏移量,默认值是0

注意:这几个参数都是相对于父容器的

参数间的关系:

x = left + translationX

y = top + translationY

注意:在View平移的过程中,top, left 是view距离父控件的原始坐标,是不会改变的

3.1.3 MotionEvent 和 TouchSlop

1. MotionEvent:是手指接触屏幕后所产生的一系列事件

ACTION_DOWN — 手指刚接触屏幕

ACTION_MOVE — 手指在屏幕上移动

ACTION_UP — 手指从屏幕上松开的一瞬间

通过MotionEvent 对象可以得到点击事件过程中发生的x,y 坐标

getX();getY(); : 返回的是相对于当前自身View 左上角的x,y 坐标

getRawX(); getRawY(); : 返回的是相对于手机屏幕左上角的x,y坐标

2.TouchSlop

TouchSlop是系统所能识别出的被认为是滑动的最小距离,意思是:当滑动的距离小于这个常量值,那么系统就不认为是在进行滑动操作,这个常量和设备有关,不同设备上这个值不同

获取方式:ViewConfiguration.get(getContext()).getScaledTouchSlop();

3.1.4 VelocityTracker GestureDetector 和 Scroller

1.VelocityTracker

速度追踪,用于追踪手指在滑动过程中的速度,包括水平和竖直方向的的速度

使用:在View 的onTouchEvent方法中追踪当前点击事件的速度

VelocityTracker velocityTracker = VelocityTracker.obtain();

velocityTracker.addMovement(event);
获取当前的速度:

velocityTracker.computeCurrentVelocity(1000);
int xVelocity = (int) velocityTracker.getXVelocity();

int yVelocity = (int) velocityTracker.getYVelocity();

需要注意:

  1. 获取速度之前必须先计算速度,即getXVelocity 和 getYVelocity这两个方法的前面必须使用computeCurrentVelocity()方法
  2. 这里的速度是指在一段时间内手指所滑过的像素数,比如将时间间隔设为1000ms,在1s内,手指在水平方向从左向右滑动100像素,那么水平速度是100,如果手指由右向左滑动,那么水平速度就为负数

速度 = (终点位置 - 起点位置)/ 时间段

如果我们通过velocityTracker.computeCurrentVelocity(100);来获取速度,那么得到的速度就是手指在100ms内所滑过的像素数,因此水平速度就成了10像素/每100ms,即水平速度为10,(这里假设滑动过程为匀速)
最后当不需要使用时,需要调用clear方法来重置并回收内存

velocityTracker.clear();

velocityTracker.recycle();

2.GestureDetector

手势检测,用于辅助检测用户的点击,滑动,长按,双击等行为

3.Scroller

弹性滑动对象,用于实现View的弹性滑动,当使用View的scrollTo/scrollBy方法来进行滑动时,其过程是瞬间完成的,没有过度效果,用户体验不好,这个时候就可以使用Scroller来实现

 Scroller scroller = new Scroller(getContext());
    //缓慢滑动到指定位置
    private void smoothScrollTo(int destX,int dextY){
        int scrollX = getScrollX();
        int delta = destX - scrollX;
        //1000ms内滑向destX ,效果就是缓慢滑动
        mScroller.startScroll(scrollX,0,delta,0,1000);
        invalidate();
    }

    @Override
    public void computeScroll() {
        if(mScroller.computeScrollOffset){
            scrollTo(mScroller.getCurrX(),mScroller.getCurrY());
            postInvalidate();
        }
    }

Scroller 本身并不能实现View的滑动,他需要配合computeScroll()方法才能实现弹性滑动的效果

3.2 View 的滑动

通过三种方式可以实现View的滑动

  1. 通过View自身提供的scrollTo/scrollBy方法

  2. 通过动画给View施加平移效果来实现滑动

  3. 通过改变View的LayoutParams使的View重新布局从而实现滑动

3.2.1 使用scrollTo/scrollBy

View的两个属性mScrollX ,mScrollY ,这两个属性可以通过getScrollX(),getScrollY()得到,mScrollX,mScrollY的单位为像素,是移动的距离
scrollTo/scrollBy实现view的滑动,只能将view 的内容进行移动,并不能将View本身进行滑动,

这里写图片描述

3.3 弹性滑动

三种方式实现弹性滑动

  1. Scroller

  2. 通过动画

  3. 使用延时策略

3.4 View的事件分发机制

3.4.1 点击事件的传递规则

事件的分发过程由三个很重要的方法来共同完成dispatchTouchEvent 、onInterceptTouchEvent 、 onTouchEvent

  1. public boolean dispatchTouchEvent(MotionEvent ev)
    用来进行事件的分发

  2. public boolean onInterceptTouchEvent(MotionEvent event)
    在上述方法内部调用,用来判断是否拦截某个事件,如果当前view拦截了某个事件,那么在同一个事件序列当中,此方法不会被再次调用,返回结果表示是否拦截当前事件

  3. public boolean onTouchEvent(MotionEvent ev)
    在dispatchTouchEvent 方法中调用,用来处理点击事件,返回结果表示是否消耗当前事件

以上三个方法的关系用以下伪代码表示

     public boolean dispatchTouchEvent(MotionEvent ev){
        boolean consume = false;
        if(onInterceptTouchEvent(ev)){
            consumen = onTouchEvent(ev);
        }else{
            consumen = child.dispatchTouchEvent(ev);
        }
        return consume;
    }

注意:
1. viewGroup 默认是不拦截任何事件的,android源码中viewGroup的onInterceptTouchEvent方法默认返回false
2. view没有onInterceptTouchEvent方法,一旦有点击事件传递给他,那么它的onTouchEvent方法就会被调用
3. view的onTouchEvent默认都会消耗事件(返回true),除非它是不可点击的(clickable 和longClickable 同时为false).View 的longClickable属性默认都为false,clickable 属性默认为false

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

Android -- 基础篇 -- view 动画(上)

一、简介: Android 系统一开始给我们提供两种实现动画效果(逐帧动画(frame-by-frame animation)和补间动画(tweened animation))。逐帧动画的工作原理很简...

Android自定义控件基础知识----View的生命周期

项目结构 核心代码: MyTextView中 package com.zhh.myview; import android.content.Context; import android.co...

Android零基础入门第24节:自定义View简单使用

当我们开发中遇到Android原生的组件无法满足需求时,这时候就应该自定义View来满足这些特殊的组件需求。...

Android自定义View——基础知识篇

自定义View的实现方式大概可以分为三种,自绘控件、组合控件、以及继承控件。 每一个view的绘制过程都经历三个主要的阶段,测量(measure)、布局(layout)及绘制(draw),在...

android自定义View基础系列一(点击随机生成验证码效果)

前言: 写了几篇博文,说实话自己很不满意,都觉得很空洞,写的也不是很好,只能硬着头皮继续写,写多了希望能好些,这一系列都是基础+练手系列,大神无视,不管怎么样,希望能对大家有点帮助吧。 本系列主要...

Android自定义view之基础知识

Android自定义view之基础知识 虽然Android已经自带了很多实用的view和layout,加以调教能实现很美观的界面,但是有一些情况下,需要实现特殊的界面效果,比如我们比较熟悉的各种播...

Android自定义View——基础知识篇

自定义View的实现方式大概可以分为三种,自绘控件、组合控件、以及继承控件。 每一个view的绘制过程都经历三个主要的阶段,测量(measure)、布局(layout)及绘制(draw),在自定义...

Android 从0开始自定义控件之 自定义 View 基础实例(十)

> 转载请标明出处: [http://blog.csdn.net/airsaid/article/details/54294144](http://blog.csdn.net/airsaid/arti...
  • Airsaid
  • Airsaid
  • 2017年01月09日 22:34
  • 2599
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:android -view基础
举报原因:
原因补充:

(最多只允许输入30个字)