前言:绘制出一个view只是自定义view的一个部分,还需要自定义一些view的行为,来反馈用户的使用操作,反馈的

   行为要合理性,就像真是的物理世界一样,不要太玄幻哦。

   可以将view的行为封装到interface中,然后去实现他。

一:处理手势操作

    1.想其他UI框架一样,android也支持输入事件处理。用户的触发事件引发回调,通过实现回调方法,即可

     自定义对用户触发的相应。在andriod系统触发时间被定义为touch,回调的是onTouchEvent(android.view.MotionEvent)

        

    2.点击触发并不是很强大的相应模式,更好的相应模式应该是手势,比如:拉,推,轻拍,扔和缩放,为了

     实现这些手势android提供了 GestureDetector类,用于实现不同的手势。

     通过继承GestureDetector.OnGestureListener或是GestureDetector.SimpleOnGestureListener

     然后实现其中的onDown(MotionEvent)方法就可自定手势了。

        

    3.在使用手势的时候,无论你继承了监听手势的哪个类,重写的onDown的方法都必须返回true,除非不顾

     整个手势的完整性,如果返回了false,如果你想要使用手势的话,那么你可以在onTouchEvent()中接受到

     手势并处理:

        

     提示:当手势返回false的时候,传入的一个点击时间不认为了手势的一部分,但可以在自定义的手势中来处

        理想实现的事件。

        就是返回true了,那么点击这个动作就被接受的方法消费了,没有了就不会向下传递了,后续的方法

        就不会调用了,返回false则相反。

二:创建一个满足物理运动的手势

    1.手势是一个强大的操作手机的方式,但是想要实现一个好的容易被人使用的手势很不容易,比如一个滚动条的手势

     用户通过手指在屏幕的控件上一滑动,控件就被滚动到其他地方了,投的过程中,开始比较快,之后就慢了些。

     这些强大手势需要满足数学公式和物理公式,是很复杂的,但是android为开发提供了几个工具类,用以实现

     不同的手势。如Scroller(滚动条)实现的滚动的手势,通过调用其中的fling(xx,xx,xx)方法来开始滚动的动作。

        

@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
mScroller.fling(currentX, currentY, velocityX / SCALE, velocityY / SCALE, minX, minY, maxX, maxY);
postInvalidate();
}

      提示:当使用GestureDetector计算的数度的时候,会发现数度太快了,所以很多开发者:

         It's common to divide the x and y velocity by a factor of 4 to 8.

    2.在使用fling()设置好物理手势之后,需要调用 Scroller.computeScrollOffset()定时的更新滚动的位置, computeScrollOffset()

     通过定时时间和物理公式来计算当前滚动到的位置。通过 getCurrX()getCurrY()来获取新的位置。

        

    3.虽然Scroller可以计算滚动的位置,但是并不会自动的将新的位置付给view,所以你需要自己去改变

     view的新位置,而且要显得自然平滑。这有两个建议:

        1.在调用了fling()后调用 postInvalidate()为了强制重新绘制view。这个技术要每次发生滚动

         的时候你在onDraw()方法中计算滚动的大小并且调用postInvalidate()

        2.在滚动的时候设置一个ValueAnimator对象,然后通过添加addUpdateListener()来控制动画。

         ValueAnimator是在API11中才有的,所以使用的时候注意。

          

三:让UI的渐变表现的更平滑

    1.用户希望拥有一个表现的更现代的更时尚的界面,同时使用起来更舒服,所以android在3.0中提供了一个新的框架

     他是UI界面中的元素过度表现的更平滑,即: property animation framework

    2.当使用动画系统的时候,不要直接更改view动画的属性,而是使用 ValueAnimator去改变动画。

      

    3.如是你想将动画应用到基本的图形view上,那有个更简单的方法,就是使用view的 ViewPropertyAnimator

      

    

android自定义View_2——Making the View Interactive的更多相关文章

  1. android 自定义ViewGroup和对view进行切图动画实现滑动菜单SlidingMenu

    示意图就不展示了,和上一节的一样,滑动菜单SlidingMenu效果如何大家都比较熟悉,在这里我简单说明一下用自定义ViewGroup来实现. 实现方法:我们自定义一个ViewGroup实现左右滑动, ...

  2. android 自定义ViewGroup和对view进行切图动画实现滑动菜单SlidingMenu[转]

    http://blog.csdn.net/jj120522/article/details/8095852 示意图就不展示了,和上一节的一样,滑动菜单SlidingMenu效果如何大家都比较熟悉,在这 ...

  3. android自定义View_3——Optimizing the View

    前言:现在你已经有了一个自定义的view了,并且支持手势和过度动画等属性,现在你要确认这个view 有够快的速度,为了使其在UI上不会显得迟钝或是卡停,你要保证view动画,能每秒最好有60帧. 一: ...

  4. Android 自定义可拖拽View,界面渲染刷新后不会自动回到起始位置

    以自定义ImageView为例: /** * 可拖拽ImageView * Created by admin on 2017/2/21. */ public class FloatingImageVi ...

  5. Android自定义组件之自动换行及宽度自适应View:WordWrapView

    目的: 自定义一个ViewGroup,里面的子view都是TextView,每个子view  TextView的宽度随内容自适应且每行的子View的个数自适应,并可以自动换行 一:效果图 二:代码 整 ...

  6. Android自定义View 画弧形,文字,并增加动画效果

    一个简单的Android自定义View的demo,画弧形,文字,开启一个多线程更新ui界面,在子线程更新ui是不允许的,但是View提供了方法,让我们来了解下吧. 1.封装一个抽象的View类   B ...

  7. Android自定义View4——统计图View

    1.介绍 周末在逛慕课网的时候,看到了一张学习计划报告图,详细记录了自己一周的学习情况,天天都是0节课啊!正好在学习Android自定义View,于是就想着自己去写了一个,这里先给出一张慕课网的图,和 ...

  8. (转)[原] Android 自定义View 密码框 例子

    遵从准则 暴露您view中所有影响可见外观的属性或者行为. 通过XML添加和设置样式 通过元素的属性来控制其外观和行为,支持和重要事件交流的事件监听器 详细步骤见:Android 自定义View步骤 ...

  9. Android 自定义View合集

    自定义控件学习 https://github.com/GcsSloop/AndroidNote/tree/master/CustomView 小良自定义控件合集 https://github.com/ ...

随机推荐

  1. RabbitMQ,Apache的ActiveMQ,阿里RocketMQ,Kafka,ZeroMQ,MetaMQ,Redis也可实现消息队列,RabbitMQ的应用场景以及基本原理介绍,RabbitMQ基础知识详解,RabbitMQ布曙

    消息队列及常见消息队列介绍 2017-10-10 09:35操作系统/客户端/人脸识别 一.消息队列(MQ)概述 消息队列(Message Queue),是分布式系统中重要的组件,其通用的使用场景可以 ...

  2. Gitlab系列九之取消用户注册页面和删除用户

    一.取消用户注册页面 Admin Area--->Settings--->Sign-up enabled(取消前面的勾)---save 二.删除用户 Users----Destroy(点他 ...

  3. 解读Spark Streaming RDD的全生命周期

    本节主要内容: 一.DStream与RDD关系的彻底的研究 二.StreamingRDD的生成彻底研究 Spark Streaming RDD思考三个关键的问题: RDD本身是基本对象,根据一定时间定 ...

  4. MPTCP 源码分析(七) 拥塞控制

    简述      MPTCP的拥塞控制对TCP的拥塞控制的线性增加阶段进行了修改,而慢启动,快速重传. 快速恢复都没有改变.每条子路径拥有自己的cwnd,MPTCP的拥塞算法主要关心cwnd的改变.   ...

  5. 利用 MySQL 技能学习 DB2 Express: DB2 与 MySQL 的管理任务和基本任务

    原文地址:http://www.ibm.com/developerworks/cn/data/library/techarticles/dm-0602tham2/index.html 简单介绍 管理不 ...

  6. ubuntu cp(copy) command

    e.g. #cp –p –R  /opt/lampp/drv ~/test   Ubuntu_Linux命令:cp(copy)复制文件或目录 功能: 复制文件或目录   www.2cto.com  说 ...

  7. (四)EasyUI 使用——form表单2 & window窗口

    form表单组件主要有以下内容(如下图)      6. progressbar进度条  每隔1秒让进度条按随机数填充,直至充满进度条刻度(只能执行一次) 进度条: <div id=" ...

  8. Sql Server2005 Synonyms

    1. 同义词(SYNONYM)是SQL Server 2005中新特性 它是一种对已有的或潜在的新对象给予的别名.可以在同一个数据库或者跨数据中中使用这个别名,这个别名替代了原有对象.可以建别名的对象 ...

  9. 基于Linux的智能家居的设计(5)

    4  软件设计 软件设计部分主要包含uboot移植.内核编译.系统移植.设备驱动编程.应用程序编程(QT编程.mysql数据库编程.控制系统编程).各个模块的功能函数(部分是在windows以下的IA ...

  10. vue 结合localStorage 来双向绑定数据

    结合localStorage 来双向绑定数据(超级神奇) localStorage.js: const STORAGE_KEY = 'todos_vuejs' export default { fet ...