zoukankan      html  css  js  c++  java
  • 自定义控件

    自定义控件

    • Android自身带的控件不能满足需求, 需要根据自己的需求定义控件.

    自定义控件可以分为三大类型

    1. 组合已有的控件实现

    • 优酷菜单
      1. 在xml布局里摆放好, OK
      2. 给指定控件添加点击事件. OK
      3. 根据业务逻辑,执行动画(旋转动画: 补间动画). OK
      4. 菜单按钮的截获. OK

    • 轮播图广告
      1. 让图片滑动起来(ViewPager), OK
      2. 让图片和文字,指示器对应起来, OK
      3. 让轮播器无限循环

          向右无限循环  
              0 -> 4  newPosition = position % 5  
              5 -> 0  
              6 -> 1  
              7 -> 2  
              8 -> 3  
              9 -> 4  
             10 -> 0  
          向左无限循环  
              设置到中间某个位置.      
      4. 轮播器自动轮询, OK      
      
    • 下拉选择框

    • Button或ImageButton等自带按钮功能的控件会抢夺所在Layout的焦点.导致其他区域点击不生效.在所在layout声明一个属性

      android:descendantFocusability="blocksDescendants"
      
    • popupwindow获取焦点, 外部可点击

          // 设置点击外部区域, 自动隐藏
      popupWindow.setOutsideTouchable(true); // 外部可触摸
      popupWindow.setBackgroundDrawable(new BitmapDrawable()); // 设置空的背景, 响应点击事件
      
      popupWindow.setFocusable(true); //设置可获取焦点
      

    2. 完全自定义控件.(继承View, ViewGroup)

      1. 自定义开关
          1. 写个类继承View, OK
          1. 拷贝包含包名的全路径到xml中, OK
          1. 界面中找到该控件, 设置初始信息, OK
          1. 根据需求绘制界面内容,OK
          1. 响应用户的触摸事件,OK
          1. 创建一个状态更新监听.OK

          // 1. 声明接口对象
          public interface OnSwitchStateUpdateListener{
          // 状态回调, 把当前状态传出去
          void onStateUpdate(boolean state);
          }
          // 2. 添加设置接口对象的方法, 外部进行调用
          public void setOnSwitchStateUpdateListener(
          OnSwitchStateUpdateListener onSwitchStateUpdateListener) {
          this.onSwitchStateUpdateListener = onSwitchStateUpdateListener;
          }
          // 3. 在合适的位置.执行接口的方法
          onSwitchStateUpdateListener.onStateUpdate(state);
    // 4. 界面/外部, 收到事件.
      1. 自定义属性
    1. 在attrs.xml声明节点declare-styleable





    2. R会自动创建变量

      attr 3个变量
      styleable 一个int数组, 3个变量(保存位置)

    3. 在xml配置声明的属性/ 注意添加命名空间

      xmlns:itheima=”http://schemas.android.com/apk/res/com.itheima74.toggleview”

      itheima:switch_background=”@drawable/switch_background”
      itheima:slide_button=”@drawable/slide_button”
      itheima:switch_state=”false”

    4. 在构造函数中获取并使用

      // 获取配置的自定义属性
      String namespace = “http://schemas.android.com/apk/res/com.itheima74.toggleview“;
      int switchBackgroundResource = attrs.getAttributeResourceValue(namespace , “switch_background”, -1);

    • Android 的界面绘制流程
      测量             摆放     绘制
      measure   ->  layout  ->  draw
          |           |          |
      onMeasure -> onLayout -> onDraw 重写这些方法, 实现自定义控件
    
      都在onResume()之后执行
    
      View流程
      onMeasure() (在这个方法里指定自己的宽高) -> onDraw() (绘制自己的内容)
    
      ViewGroup流程
      onMeasure() (指定自己的宽高, 所有子View的宽高)-> onLayout() (摆放所有子View) -> onDraw() (绘制内容)
    
      1. 侧滑面板

    3. 继承已有的控件实现(扩展已有的功能)

      1. 包含下拉刷新功能的ListView

      2. 添加了自定义的头布局

      3. 默认让头布局隐藏setPadding.设置 -自身的高度
      4. ListView下拉的时候, 修改paddingTop, 让头布局显示出来
      5. 触摸动态修改头布局, 根据paddingTop.

        • paddingTop = 0 完全显示
        • paddingTop < 不完全显示 -64(自身高度)完全隐藏
        • paddingTop > 0 顶部空白
      6. 松手之后根据当前的paddingTop决定是否执行刷新

        • paddingTop < 0 不完全显示, 恢复
        • paddingTop >= 0 完全显示, 执行正在刷新…
  • 相关阅读:
    集合综合练习<三>
    集合综合练习<二>
    集合综合练习<一>
    java打分系统
    mysql存储过程
    mysql的视图、索引、触发器、存储过程
    mysql
    Java 集合底层原理剖析(List、Set、Map、Queue)
    HashMap底层实现
    Gradle
  • 原文地址:https://www.cnblogs.com/charleswone/p/10228760.html
Copyright © 2011-2022 走看看