美文网首页
自定义View范例

自定义View范例

作者: 兔斯基第2号 | 来源:发表于2017-09-14 15:16 被阅读0次

自定义属性

像android:layout_width和android:padding这种以android开头的属性是系统自带的,还可以添加自定义属性。

  1. 在res/values文件夹下建立xml,如attrs.xml(命名随意)。


  2. 在View的构造方法中解析自定义属性的值并做相应处理。


    public CircleView(Context context) {
        super(context);
        init();
    }

    public CircleView(Context context, @Nullable AttributeSet attrs) {
        this(context, attrs, 0);
    }

    public CircleView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        // 加载自定义属性集合CircleView,接着解析CircleView属性集合中的circle_color属性,它的id是R.styleable.CircleView_circle_color
        TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.CircleView);
        mColor = typedArray.getColor(R.styleable.CircleView_circle_color, Color.GRAY);
        // 释放资源
        typedArray.recycle();
        init();
    }

3.在布局文件中使用自定义属性。为使用,必须在布局文件中添加schemas声明(命名空间)

xmlns:app="http://schemas.android.com/apk/res-auto"
    <com.example.jkdemo.CircleView
        android:id="@+id/circleView"
        android:layout_width="100dp"
        android:layout_height="100dp"
        android:text="啊啊啊"
        android:gravity="center"
        android:layout_gravity="center"
        app:circle_color="@color/colorAccent"
        />

除此之外

  1. 如果是直接继承View或者ViewGroup实现的话,需要在onMeasure中对wrap_content做特殊处理,否则在布局中使用wrap_content时就无法达到预期效果。

  2. 如果可以,支持padding,如果不在draw方法里处理padding,那么padding属性是不起作用的。处理很简单,就是在绘制的时候考虑到View四周的空白,即在使用或者获取宽高的时候减掉上下左右相应padding值就可以了。

范例

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <declare-styleable name="CircleView">
        <attr name="circle_color" format="color"/>
    </declare-styleable>
</resources>
public class CircleView extends TextView {
    private Paint mPaint;
    private int mColor;

    public CircleView(Context context) {
        super(context);
        init();
    }

    public CircleView(Context context, @Nullable AttributeSet attrs) {
        this(context, attrs, 0);
    }

    public CircleView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.CircleView);
        mColor = typedArray.getColor(R.styleable.CircleView_circle_color, Color.GRAY);
        typedArray.recycle();
        init();
    }

    private void init() {
        mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
        mPaint.setStyle(Paint.Style.FILL);
        mPaint.setColor(mColor);
    }

    @Override
    protected void onDraw(Canvas canvas) {
        int width = getWidth();
        int height = getHeight();
        int radius = Math.min(width, height) / 2;
        canvas.drawCircle(width / 2, height / 2, radius, mPaint);
        super.onDraw(canvas);
    }
}
    <com.example.jkdemo.CircleView
        android:id="@+id/circleView"
        android:layout_width="100dp"
        android:layout_height="100dp"
        android:text="啊啊啊"
        android:gravity="center"
        android:layout_gravity="center"
        app:circle_color="@color/colorAccent"
        />

相关文章

  • 自定义View范例

    自定义属性 像android:layout_width和android:padding这种以android开头的属...

  • Android View(转)

    自定义View的原理自定义View基础 - 最易懂的自定义View原理系列自定义View Measure过程 - ...

  • 自定义View系列

    自定义View1---知识储备自定义View2---View Measure过程自定义View3---View L...

  • 自定义View5---完整的自定义View

    移步自定义View系列 1.自定义view的分类自定义单一view(不含子view)继承view继承特定view如...

  • 自定义View

    自定义View系列文章 自定义View view向上滚动

  • 自定义View(一) 自定义View的概述

    不怕跌倒,所以飞翔 自定义View概述 1.自定义View分类 自定义View 直接继承View主要是绘制 自定义...

  • Android自定义View

    Android自定义View 参考:从此再有不愁自定义View——Android自定义view详解android ...

  • 自定义view

    Android自定义View 为什么要自定义View自定义View的基本方法 自定义View的最基本的三个方法分别...

  • Android 之 自定义View全解

    本文主要有以下内容: 自定义View的分类 自定义View的注意事项 自定义View的不同实现 自定义View使其...

  • 高级Android工程师进阶系列文章汇总

    自定义View HenCoder(朱凯)自定义View系列 自定义view总结 Android 样式的开发 And...

网友评论

      本文标题:自定义View范例

      本文链接:https://www.haomeiwen.com/subject/bfkdsxtx.html