自定义控件与自定义属性

自定义按钮

实现自定义按钮有多种方式:

  • 使用图片
  • shape配置
  • 自定义绘图

使用图片方式

  • 添加2张图片,点击和未点击效果
  • 编写selector.xml文件
  • 设置background
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_pressed="false" android:drawable="@drawable/a"/>
    <item android:state_pressed="true" android:drawable="@drawable/b"/>
</selector>


缺点:大量图片会使得apk变大,进而导致安装,下载缓慢问题。

app设计原则之一

apk打包需尽量小,能不用资源,尽量不用资源。

shape方式

  • res下新建drawable文件夹,该文件夹专门用来存放图片无关的.xml文件,例如selector、shape等类型的xml文件。
  • 编写selector.xml文件,在item节点下编写shape
  • 设置background
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">

    <item android:state_pressed="false"><shape>
            <solid android:color="#ff0000" />
        </shape></item>
    <item android:state_pressed="true"><shape>
            <solid android:color="#0000ff" />
        </shape></item>
</selector>

缺点:配置不够灵活。

绘制

要使得控件具有一般控件属性,需继承View类,该类是安卓所有控件的父类。

public class MyButton extends View {
    // 画笔
    private Paint paint;

    public MyButton(Context context) {
        super(context);
        // TODO Auto-generated constructor stub
        init();
    }

    //思考:若没有该构造函数,将会引发什么问题?
    public MyButton(Context context, AttributeSet attrs) {
        super(context, attrs);
        // TODO Auto-generated constructor stub
        init();
    }

    //完成初始化参数的工作,初始化画笔
    private void init(){
        paint = new Paint();
        //消除锯齿
        paint.setAntiAlias(true);
    }

    //绘制控件主要方法
    @Override
    protected void onDraw(Canvas canvas) {
        // canvas理解为画布
        super.onDraw(canvas);
    }

    //定义控件大小
    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        // widthMeasureSpec和heightMeasureSpec不仅包括大小信息,还包括设置模式,可通过MeasureSpec的静态方法获取
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
    }

    //实现事件监听
    @Override
    public boolean onTouchEvent(MotionEvent event) {
        // TODO Auto-generated method stub
        return super.onTouchEvent(event);
    }
}

自定义控件设计原则

控件尽量不留边界,由外部layout文件控制。

自定义属性

  • res/values文件夹下新建attr.xml文件
  • 新增属性

    <?xml version="1.0" encoding="utf-8"?>
    <resources>
      <declare-styleable name="MyButtonAttr">
          <attr name="text" format="string"></attr>
      </declare-styleable>
    </resources>
    
  • 控件初始化时获取自定义属性值

    if(null!=attr){
              TypedArray typedArray = getContext().obtainStyledAttributes(attr,
                      R.styleable.MyButtonAttr);
              text = typedArray.getString(R.styleable.MyButtonAttr_text);
              // 注意回收
              typedArray.recycle();
          }
    
  • 布局文件中添加命名空间

    xmlns:myview="http://schemas.android.com/apk/res-auto"
    
  • 写入具体属性值
    <com.example.uitest.MyButton
          android:id="@+id/mybutton"
          android:layout_width="100dp"
          android:layout_height="100dp"
          myview:text = "测试"
          />
    

自定义控件步骤

  1. 继承view,重写onDraw(Canvas canvas)方法,画出控件形状
  2. 重写view.onKeyDown或onTouchEvent方法,以便能够得到用户的输入,做出相应动作。
  3. 根据控件特性,为控件的特殊功能提供关键事件的监听器接口
  4. 让自定义控件能够支持android layout配置文件进行配置(编写attrs.xml),并能够读取配置文件的控件属性值。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值