安卓动态交互 | 青训营笔记

186 阅读3分钟

这是我参与「第四届青训营 」笔记创作活动的的第5天

常用交互事件监听器

  1. 分类
    • onClick(): 按压时系统自动调用此方法(在抬起时执行)
    • onLongClick(): 长按(和onCLick()互斥,两者不会同时执行)
    • onFocusChange(): 轨迹球转到或离开项目时
    • onKey(): 按下或释放硬件按键时
    • onTouch(): 所有触摸操作
  2. 事件常量()
    • ACTION_DOWN、ACTION_UP:手指触摸、离开屏幕
    • ACTION_MOVE:手指在屏幕上滑动
    • ACTION_CANCEL:当事件序列要提早终止时系统自动产生此事件
    • ACTION_POINTER_DOWN:多点触摸,第一个手指后还有手指触摸
    • ACTION_POINTER_UP:多点触摸,其他手指离开屏幕只剩一只手指
  3. 原理:当用户操作屏幕时,会回调触摸视图上的onTouchEvent()。对于最终被识别为手势的每个轻触事件序列,onTouchEvent()都会多次触发
    (Activity和View都有onTouchEvent() )
  4. 例:
@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
      微信图片_20220730152931.png

动画

  • 类型:帧动画、补间动画、属性动画

  • 帧动画

    • 作用对象:视图控件(如ImageView、TextView等)
    • 原理:
      1. 将动画分解为“帧”形式,每帧=一张图片
      2. 按指定顺序和间隔播放一组图片
    • 优点:使用简单方便,顺序和时序可控
    • 缺点:功能单一,容易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

  1. 创建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)
    • 自定义属性
    • 获取自定义属性
  2. 处理View布局 (复写方法)
    • onMeasure():一般需要复写宽高设置为wrap_content场景、以及组件宽高比例限制
    • onLayout():继承自ViewGroup时必须复写,继承自View时一般不用
    • onSizeChanged():视图大小发生改变时调用
    • 可利用 requestLayout() 方法触发View重布局
  3. 处理绘制:View的绘制基本由 measure()、layout()、draw() 这个三个函数完成
    • View绘制时,按需复写 onDraw 方法
    • 利用Canvas和Paint来绘制View
      微信图片_20220730170810.png
    • 利用 invalidate() / postlnvalidate() 触发View重绘
  4. 处理交互:
    • 获取响应时间,按需复写 onTouchEvent 方法
    • 根据 MotionEvent 处理相应的交互事件
    • 必要时通过复写 onInterceptTouchEvent 来拦截事件
    • 必要时通过复写 dispatchTouch 来分发事件
  5. 处理动画
    • 根据动画需要选择合适动画类型
    • 按需启动动画、适时停止动画
    • 可利用 AnimatorListener 来监听动画