Android开发Android技术知识Android开发经验谈

Android学习—— Android自定义控件

2019-04-22  本文已影响14人  python草莓

Android自定义控件

安卓在使用中大多数使用已有的一些控件,用法比较简单,还有一部分是比较复杂的、用户自己想的控件,这些就需要进行自定义控件,今天就来简单说一下自定义控件。

1、绘制过程

以上就是自定义控件的绘制过程。

2、主要内容解释

用于计算视图的大小,即视图的宽度和长度。在view中定义为final类型,要求子类不能修改。measure()函数中又会调用下面的函数:

 (1)onMeasure(),确定视图大小,也就是说measure只是对onMeasure的一个包装,子类可以覆写onMeasure()方法实现自己的计算视图大小的方式,并通过setMeasuredDimension(width, height)保存计算结果。

(2)关于MeasureSpec:

UPSPECIFIED:父容器对于子容器没有任何限制,子容器想要多大就多大.

EXACTLY:父容器已经为子容器设置了尺寸,子容器应当服从这些边界,不论子容器想要多大的空间.

AT_MOST:子容器可以是声明大小内的任意大小.

从上面可以看出自定义View需要最少覆写onMeasure()和onDraw()两个方法。

  1. onFinishInflate(): 回调方法,当应用从XML加载该组件并用它构建界面之后调用的方法
  2. onMeasure():检测View组件及其子组件的大小
  3. onLayout(): 当该组件需要分配其子组件的位置、大小时
  4. onSizeChange():当该组件的大小被改变时
  5. onDraw(): 当组件将要绘制它的内容时
  6. onKeyDown: 当按下某个键盘时
  7. onKeyUp: 当松开某个键盘时
  8. onTrackballEvent: 当发生轨迹球事件时
  9. onTouchEvent: 当发生触屏事件时
  10. onWindowFocusChanged(boolean):当该组件得到、失去焦点时
  11. onAtrrachedToWindow():当把该组件放入到某个窗口时
  12. onDetachedFromWindow():当把该组件从某个窗口上分离时触发的方法
  13. onWindowVisibilityChanged(int):当包含该组件的窗口的可见性发生改变时触发的方法

3、效果图展示

1.png

4、代码展示

在java代码中我加了很多注释,方便进行理解、学习。

布局文件

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/container"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <sample.sdk.qy.com.androiddemo.Customize
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_margin="20dp"
        />

</LinearLayout>

自定义控件类

public class Customize extends View {
    private final static String TAG = Customize.class.getSimpleName();
    private Paint mPaint;
    private RectF oval;

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

    public Customize(Context context, AttributeSet attrs) {
        super(context, attrs);
        init();
    }

    public Customize(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        init();
    }

    private void init(){
        mPaint = new Paint();
        mPaint.setAntiAlias(true);
        oval=new RectF();
    }
    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
        int widthMode = MeasureSpec.getMode(widthMeasureSpec);
        int widthSize = MeasureSpec.getSize(widthMeasureSpec);
        int heightMode = MeasureSpec.getMode(heightMeasureSpec);
        int heightSize = MeasureSpec.getSize(heightMeasureSpec);
        switch (widthMode) {
            case MeasureSpec.EXACTLY:
                break;
            case MeasureSpec.AT_MOST:
                break;
            case MeasureSpec.UNSPECIFIED:
                break;
        }
    }

    @Override
    protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
        super.onLayout(changed, left, top, right, bottom);

    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        //设置演颜色
        mPaint.setColor(Color.GREEN);
        // FILL填充, STROKE描边,FILL_AND_STROKE填充和描边
        mPaint.setStyle(Paint.Style.FILL_AND_STROKE);
        //获取控件的宽度和高度
        int with = getWidth();
        int height = getHeight();
        //设置圆的半径
        float radius = with / 4;
        //画圆,设置颜色
        canvas.drawCircle(with / 2, with / 2, radius, mPaint);
        mPaint.setColor(Color.BLUE);
        //用于定义的圆弧的形状和大小的界限
        oval.set(with / 2 - radius, with / 2 - radius, with / 2
                + radius, with / 2 + radius);
        //根据进度画圆弧
        canvas.drawArc(oval, 270, 90, true, mPaint);
        //画出另一个圆弧
        mPaint.setColor(Color.YELLOW);
        canvas.drawArc(oval, 360, 120, true, mPaint);
    }
}

MainActivity类

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

    }

}

有兴趣的朋友或者有疑问的朋友欢迎留言讨论

上一篇下一篇

猜你喜欢

热点阅读