Android自定义View的方法

本文大部分直接或间接引用 Mr梵谷 博客中的博文,在此声明并鸣谢


有时候Android传统的页面布局不足以满足我们的需求,常常需要自己定义view,通常继承View,然后重写构造方法以及onDraw等函数,再具体实现自己定义的复杂view。我们知道在给控件赋属性时,通常使用的是android系统自带的属性,比如 android:layout_height="wrap_content",除此之外,我们亦可以自己定义属性,这样在使用的时候我们就可以使用形如 myapp:myTextSize="20sp"的方式了

1》在项目文件res/value下面创建一个attr.xml文件,该文件中包含若干个attr集合,例如:

这里MyView是包名,attr是属性名,format是对应的参数

  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <resources>  
  3.     <declare-styleable name="MyView">  
  4.         <attr name="myTextSize" format="dimension"/>  
  5.         <attr name="myColor" format="color"/>  
  6.     </declare-styleable>  
  7. </resources>  

2》在使用到该自定义view的布局文件中键入如下:

  • xmlns:myapp=“......................../res-auto”(AS中最后这样加)
  • 而xmlns:tools="http://schemas.android.com/tools"这一行不可以有,否则会出错
    这样一来,在我们自己定义的view的属性中,就可以使用自己在attr中定义的属性啦

3》编写一个Java的类来编辑自己定义的View,例如可以在button中加个图形:

public class MyButton extends Button{
    private Drawable drawable;
    private float drawableWidth,drawableHeight,buttonHeight;
    public MyButton(Context context, AttributeSet attrs) {
        super(context, attrs);
        TypedArray a=context.obtainStyledAttributes(attrs, R.styleable.my);
//        get XML文件里设置的图片
        drawable=a.getDrawable(R.styleable.my_drawable);
//        get 图片的size
        drawableWidth=drawable.getIntrinsicWidth();
        drawableHeight=drawable.getIntrinsicHeight();
    }

    @Override
    protected void onMeasure(int widthMeasureSpec,int heightMeassureSpec) {
        super.onMeasure(widthMeasureSpec,heightMeassureSpec);
        buttonHeight= MeasureSpec.getSize(heightMeassureSpec);
    }
    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        drawable.setBounds(10,10,(int)((buttonHeight-20)/drawableHeight*drawableWidth+10),
                (int)((buttonHeight-10)));
        drawable.draw(canvas);
    }
}

调用结束后务必调用recycle()方法,否则这次的设定会对下次的使用造成影响

效果示例:


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值