• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >Android > Android开发艺术探索学习笔记(三),android艺术探索

Android开发艺术探索学习笔记(三),android艺术探索

作者:网友 字体:[增加 减小] 来源:互联网 时间:2017-05-26

网友通过本文主要向大家介绍了Android开发艺术探索学习笔记(三),android艺术探索等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

Android开发艺术探索学习笔记(三),android艺术探索


第三章  View的事件体系

  3.1 View基础知识

  3.1.1 什么是view

    View 是Android中所有控件的基类,是一种界面层的控件的一种抽象,它代表了一个控件。

  3.1.2 View的位置参数

    View的位置主要由它的四个顶点来决定,分别对应于View的四个属性:top,left,right,bottom;需要注意的是这些坐标都是相对于View的父容器来说的;(在Android中X轴和Y轴的正方向分别为右和下)。

    3.0开始新增的属性

    x-  view左上角横坐标;

    y-  view左上角纵坐标;

    translationX-  view左上角相对于父容器的水平偏移量;

    translationY-  view左上角相对于父容器的垂直偏移量;

    View在平移过程中,top和left表示的是原始左上角的位置信息,其值并不会发生变化,此时发生变化的是x,y,translationX,translationY这四个参数。

  3.1.3 MotionEvent和TouchSlop

    1 MotionEvent

    getX和getY方法返回的是当前View左上角的x和y坐标,而getRawC和getRawY方法返回的是相对于手机屏幕左上角的x和y坐标。

    2 TouchSlop

    TouchSlop是系统所能识别出的被认为是滑动的最小距离,是一个常量,通过如下方式可以获得这个常量:ViewConfiguration.get(getContext()).getScaledTouchSlop();

  3.1.4 VelocityTracker,GestureDetector和Scroller

    1 VelocityTracker

    VelocityTracker—速度追踪,追踪手指在滑动过程中的速度(水平垂直两个方向),注意速度可以为负值,当手指从右向左滑动时,水平方向速度即为负值。

    2 GestureDetector

    GestureDetector—手势检测,用于辅助检测用户的单击,滑动,长,双击等行为。

    建议:如果只是监听滑动相关的,在onTouchEvent中实现,如果要监听双击行为就用GestureDetector。

    3 Scroller

    Scroller—弹性滑动,用于实现View的弹性滑动(有过渡效果的滑动),需要配合View的computeScroll方法使用。

  3.2 View的滑动

    实现View滑动的三种方式:

    1 通过View本身的scrollTo/scrollBy方法实现滑动;

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

    3 通过改变View的LayoutParams使得View重新布局实现滑动;

  3.2.1 使用scrollTo/scrollBy

    scrollTo/scrollBy的源码如下:

public void scrollTo(int x ,int y){
if(mScrollX!=x||mScrollY!=y){
    int oldX=mScrollX;
    int oldY=mScrollY;
    mScrollX=x;
    mScrollY=y;
    invalidateParentCaches();
    onScrollChanged(mScrollX,mScrollY,oldX,oldY);
    if(!awakenScrollBars()){
    postInvalidateOnAnimation();
    }
  }
}

public void scrollBy(int x,int y){
    scrollTo(mScrollX+x,mScrollY+y);
}

    其中mScrollX的值总是等于View左边缘和View内容左边缘在水平方向的距离,mScrollY的值总是等于View的上边缘和View内容上边缘在垂直方向上的距离;

     scrollTo/scrollBy只能改变View内容的位置而不能改变自身在布局中的位置。

     也就是说使用scrollTo/scrollBy来实现View的滑动只能将View的内容进行移动,并不能将View本身进行移动。

  3.2.2 使用动画

    使用动画来移动View 主要是操作View的translationX和translationY属性。(传统的View动画和属性动画)

     View动画是对View的影像操作,它并不能真正改变View的位置参数,包括宽/高。

  3.2.3 改变布局参数

    主要是通过改变View的LayoutParams来实现;下面的代码展示如何给一个mButton1重新设置LayoutParams:

MarginLayoutParams params=(MarginLayoutParams)mButton1.getLayoutParams();
params.width+=100;
params.leftMargin+=100;
mButton1.requestLayout();
//或者mButton1.setLayoutParams(params)

  3.2.4各种滑动方式的对比

    scrollTo/scrollBy:操作简单,适合对View内容的滑动;

     动画:操作简单,主要适用于没有交互的View和实现复杂的动画效果;

     改变布局参数:操作稍微复杂,适用于有交互的View。

  3.3弹性滑动

  3.3.1使用Scroller

     注意Scroller产生的滑动也是对View内容的滑动而非View本身位置的改变。

    Scroller的典型使用方式如下:

Scroller scroller=new Scroller(context);
//缓慢滚动到指定位置
private void smoothScrollTo(int destX,int destY){
    int scrollx=getScrollX();
    int deltaX=destX-scrollX;
    //1000ms内滑向destX,效果就是慢慢滑动
    scroller.startScroll(scrollX,0,deltaX,0,1000);
    invalidate();
}
@Override
public void computeScroll(){
    if(scroller.computeScrollOffset()){
    scrollTo(scroller.getCurrX(),scroller.getCurrY());
    postInvalidate();
    }
}

    Scroller的工作机制:Scroller本身并不能实现View的滑动,它需要配合View的computeScroll方法才能完成弹性滑动的效果,它不断的让View重绘,而每一次重绘距滑动起始时间会有一个时间间隔,通过这个时间间隔Scroller就可以得出View当前的滑动位置,知道了滑动位置就可以通过scrollTo方法来View的滑动。就这样,View的每一次重绘都会导致View进行小幅度的滑动,而多次的小幅度滑动就组成了弹性滑动。

  3.4 View的时间分发机制

  3.4.1 点击事件的传递规则

    点击事件的分发过程主要由三个方法来完成。

    dispatchTouchEvent() :用来进行事件的分发,如果事件能够传递给当前View,此方法一定会被调用,返回结果受当前View的onTouchEvent和下级View的dispatchTouchEvent方法影响,表示是否消耗当前事件。

    onInterceptTouchEvent() :在dispatchTouchEvent方法内部调用,判断是否拦截某个事件,如果当前View拦截了某个事件,那么在同一个事件序列中,此方法不会在被调用,返回结果表示是否拦截当前事件。

    onTouchEvent() :在dispatchTouchEvent方法中调用,用来处理点击事件,返回结果表示是否消耗当前事件,如果不消耗,则在同一个事件序列中,当前View无法再次接收到其他事件。

    事件序列是指从手指接触屏幕的那一刻起,到手指离开屏幕的那一刻结束,在这个过程中所产生的一系列事件,这个事件序列以down事件开始,中间含有数量不固定的move事件,最终以up事件结束。

    理解了这三个方法的工作过程也就理解了事件的分发机制。伪代码表示三个方法的关系如下:

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



 
分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • Android开发艺术探索学习笔记(三),android艺术探索

相关文章

  • 2017-05-26牛刀小试Oracle之ORACLE 11GR2 RAC安装配置--先决配置阶段
  • 2017-05-26Android的Kotlin秘方(I):OnGlobalLayoutListener,
  • 2017-05-26Android Volley框架的使用(4),androidvolley
  • 2017-05-26Android实现按钮点击效果(第一次点击变色,第二次恢复),android按钮
  • 2017-05-26日志文件之出错处理
  • 2017-05-223.5 监听EditText的内容变化
  • 2017-05-26Android学习笔记(28):三种选择器DatePicker_TimePicker_NumberPicker剖析
  • 2017-05-26高并发低基数多字段任意组合查询的优化
  • 2017-05-227.5.1 WebView(网页视图)基本用法
  • 2017-05-26我的Android第五章:通过Intent实现活动与活动之间的交互,androidintent

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • 硅谷社交6--添加联系人--发送添加好友邀请,硅谷6--
    • Android studio 插件安装 plugin
    • BadgeView使用,jsbadgeview使用方法
    • Android 数据库操作,android数据库操作
    • 总结一下Android中主题(Theme)的正确玩法,androidtheme
    • Android Studio同时打开多个项目,androidstudio
    • retrofit2中ssl的Trust anchor for certification path not found问题,retrofit2anchor
    • Android EditText只有下面有一条横线问题
    • android历史
    • 安卓应用反编译(二)-APK包反编译浅析

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有