这是我参与「第四届青训营 」笔记创作活动的的第5天
常用交互事件监听器
- 分类
- onClick(): 按压时系统自动调用此方法(在抬起时执行)
- onLongClick(): 长按(和onCLick()互斥,两者不会同时执行)
- onFocusChange(): 轨迹球转到或离开项目时
- onKey(): 按下或释放硬件按键时
- onTouch(): 所有触摸操作
- 事件常量()
- ACTION_DOWN、ACTION_UP:手指触摸、离开屏幕
- ACTION_MOVE:手指在屏幕上滑动
- ACTION_CANCEL:当事件序列要提早终止时系统自动产生此事件
- ACTION_POINTER_DOWN:多点触摸,第一个手指后还有手指触摸
- ACTION_POINTER_UP:多点触摸,其他手指离开屏幕只剩一只手指
- 原理:当用户操作屏幕时,会回调触摸视图上的onTouchEvent()。对于最终被识别为手势的每个轻触事件序列,onTouchEvent()都会多次触发
(Activity和View都有onTouchEvent() ) - 例:
@Override
public boolean onTouchEvent(MotionEvent event) {
int action = MotionEventCompat.getActionMasked(event);
switch (action){
case(MotionEvent.ACTION_DOWN):
Log.d(DEBUG_TAG,"Action was DOWN");
break;
case(MotionEvent.ACTION_CANCEL):
Log.d(DEBUG_TAG,"Action was CANCEL");
break;
default:
return super.onTouchEvent(event);
}
return true;
}
5.事件分发
- 顺序:Activity -> ViewGroup -> View
- 核心方法:
- dispathTouchEvent
- onInterceptTouchEvent
- onTouchEvent
动画
-
类型:帧动画、补间动画、属性动画
-
帧动画
- 作用对象:视图控件(如ImageView、TextView等)
- 原理:
- 将动画分解为“帧”形式,每帧=一张图片
- 按指定顺序和间隔播放一组图片
- 优点:使用简单方便,顺序和时序可控
- 缺点:功能单一,容易OOM
- 应用场景:连续性动画
- 例:
-
补间动画
- 作用对象:视图控件(如ImageView、TextView等)
- 原理:通过确定开始视图样式和结束视图央视,中间样式有系统根据差值器确定来形成完整动画
- 动画类型:
- 透明度动画
- 旋转动画
- 缩放动画
- 平移动画
- 优点:简单方便
- 缺点:只能控制视图效果,无法控制属性
- 应用场景:旋转动画,视图基础动画
- 例:
public void tweenedAnimation(View view){ //透明度动画 AlphaAnimation alphaAnimation = new AlphaAnimation(1, 0); alphaAnimation.setDuration(3000); //旋转动画 RotateAnimation rotateAnimation = new RotateAnimation(0, 360, Animation.RELATIVE_TO_SELF, 0.5F,Animation.RELATIVE_TO_SELF, 0.5f); rotateAnimation.setDuration(3000); //缩放动画 ScaleAnimation scaleAnimation = new ScaleAnimation(1, 0.5f, 1, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f); scaleAnimation.setDuration(3000); //平移动画 TranslateAnimation translateAnimation = new TranslateAnimation(Animation.RELATIVE_TO_SELF, 0, Animation.RELATIVE_TO_SELF, 1,Animation.RELATIVE_TO_SELF, 0, Animation.RELATIVE_TO_SELF, 1); translateAnimation.setDuration(3000); //组合动画 AnimationSet animationSet = new AnimationSet(true); animationSet.addAnimation(alphaAnimation); animationSet.addAnimation(rotateAnimation); animationSet.addAnimation(scaleAnimation); animationSet.addAnimation(translateAnimation); view.startAnimation(animationSet); }- 差值器(INterpolator):设置动画变化速度
- 例:AccelerateDecelerateInterpolator:末慢,中间加速
- 其余的要用到再百度
-
属性动画
- 作用对象:任意java对象,不再局限于View
- 原理:再指定时间间隔内,不断 改变值&赋值 给对象
- 特点:不限于View对象,动画效果丰富
- 应用场景:与属性相关的,复杂的动画
public void startObjectAnimatorSet(){ //改变其x属性(从1变化到0.5) Animator scaleX = ObjectAnimator.ofFloat(imageView, "scaleX", 1, 0.5f); scaleX.setDuration(2000); //沿x轴转动(从0变化到360) Animator rotationX = ObjectAnimator.ofFloat(imageView, "rotationX", 0 , 360); rotationX.setDuration(2000); //imageView是动画主体 }
自定义View
- 创建View
- 构造器
- java代码中创建View:
TestView(Context context) - 通过XML声明创建View:
TestView(Context context, @Nullable AttributeSet attrs) - 通过XML声明创建View+Style:
TestView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) - 通过XML声明创建View+Style+Theme:
TestView(Context context, @Nullable AttributeSet attrs, int defStyleAttr, int defStyleRes)
- java代码中创建View:
- 自定义属性
- 获取自定义属性
- 构造器
- 处理View布局 (复写方法)
- onMeasure():一般需要复写宽高设置为wrap_content场景、以及组件宽高比例限制
- onLayout():继承自ViewGroup时必须复写,继承自View时一般不用
- onSizeChanged():视图大小发生改变时调用
- 可利用 requestLayout() 方法触发View重布局
- 处理绘制:View的绘制基本由 measure()、layout()、draw() 这个三个函数完成
- View绘制时,按需复写 onDraw 方法
- 利用Canvas和Paint来绘制View
- 利用 invalidate() / postlnvalidate() 触发View重绘
- 处理交互:
- 获取响应时间,按需复写 onTouchEvent 方法
- 根据 MotionEvent 处理相应的交互事件
- 必要时通过复写 onInterceptTouchEvent 来拦截事件
- 必要时通过复写 dispatchTouch 来分发事件
- 处理动画
- 根据动画需要选择合适动画类型
- 按需启动动画、适时停止动画
- 可利用 AnimatorListener 来监听动画