应用界面设计(原生,自定义控件,设计与交互-小白必看)

目录

一图概览

界面实现方式

XML布局方式

JAVA或Kotlin代码布局

Android定制控件

Android原生核心控件

为什么不用原生?

定制控件三大方法

定制控件流程

触摸事件(input事件处理)流程

分发 (dispatchTouchEvent)

拦截 (onInterceptTouchEvent)

处理 (onTouchEvent)

实例Demo

优化界面

资源优化

代码优化

控件优化


一图概览


界面实现方式

XML布局方式

  1. xml文件添加控件,设置其属性和布局约束
  2. 可以在其他xml文件通过layout="@layout/资源布局id",导入其他xml文件作一个控件

JAVA或Kotlin代码布局

  1. 创建控件容器
  2. 创建具体控件
  3. 将创建控件添加到父容器
  4. 加载到Content


Android定制控件

Android原生核心控件

为什么不用原生?

  1. 原生过于刻板,无法满足一些特别需求(炫酷动画,创新功能)

  2. 布局层次过于复杂,影响程序性能

定制控件三大方法

  1. 基于现有控件继承扩展
  2. 通过现有控件组合布局
  3. 直接继承View,深度自定义

定制控件流程

  1. 构造函数负责属性的解析与初始化

  2. View由onMeasure()尺寸计算

  3. ViewGroup考虑子View布局位置

  4. 内容绘制,onDraw()实现形状、颜色、阴影等

  5. 交互实现Input事件的处理

  6. 提供外部调用的接口


触摸事件(input事件处理)流程

分发 (dispatchTouchEvent)

  1. 当触摸事件发生时,事件首先被传递给 ViewGroup 的 dispatchTouchEvent 方法。
  2. 如果 ViewGroup 有一个子视图可以处理该事件(即子视图的 onTouchEvent 方法返回 true),则事件会被传递给子视图。
  3. 如果没有子视图可以处理该事件(返回false),事件会传递给父视图。

拦截 (onInterceptTouchEvent)

  1. 在触摸事件被传递给子视图之前,ViewGroup 的 onInterceptTouchEvent 方法会被调用。
  2. 如果 onInterceptTouchEvent 返回 true,事件将被此父视图拦截,并且不会传递给子视图。
  3. 如果 onInterceptTouchEvent 返回 false,事件将传递给子视图。

处理 (onTouchEvent)

  1. 如果触摸事件没有被拦截,它将传递给子视图的 onTouchEvent 方法进行处理。
  2. 如果子视图的 onTouchEvent 返回 true,表示子视图已经处理了该事件。
  3. 如果子视图的 onTouchEvent 返回 false,事件将传递回父视图处理。

实例Demo

public class MyLinearLayout extends LinearLayout {

    private float initialX;

    public MyLinearLayout(Context context) {
        super(context);
    }

    public MyLinearLayout(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public MyLinearLayout(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

    @Override
    public boolean onInterceptTouchEvent(MotionEvent ev) {
        final int action = ev.getAction();
        switch (action) {
            case MotionEvent.ACTION_DOWN:
                initialX = ev.getX();
                break;
            case MotionEvent.ACTION_MOVE:
                float diffX = Math.abs(initialX - ev.getX());
                if (diffX > 10) { // 如果手指移动超过10像素,则拦截事件
                    return true;
                }
                break;
        }
        return super.onInterceptTouchEvent(ev);
    }
}

优化界面

资源优化

代码优化

控件优化

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值