美文网首页
自定义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范例

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