自定义View的简单介绍与简单使用

本文介绍了Android View的14个周期,包括onFinishInflate()、onMeasure()等。涵盖了从子控件映射成xml、确定子元素大小位置,到按键、触屏、焦点变化等不同情况下触发的周期,还提及附着和离开窗口以及窗口可见性变化时的周期。

自定义View的简单介绍与简单使用

android view有以下14个周期:
1、onFinishInflate() 当View中所有的子控件均被映射成xml后触发 。
2、onMeasure( int , int ) 确定所有子元素的大小 。
3、onLayout( boolean , int , int , int , int ) 当View分配所有的子元素的大小和位置时触发 。
4、onSizeChanged( int , int , int , int ) 当view的大小发生变化时触发 。
5、onDraw(Canvas) view渲染内容的细节。
6、onKeyDown( int , KeyEvent) 有按键按下后触发 。
7、onKeyUp( int , KeyEvent) 有按键按下后弹起时触发 。
8、onTrackballEvent(MotionEvent) 轨迹球事件 。
9、onTouchEvent(MotionEvent) 触屏事件 。
10、onFocusChanged( boolean , int , Rect) 当View获取或失去焦点时触发 。
11、onWindowFocusChanged( boolean ) 当窗口包含的view获取或失去焦点时触发 。
12、onAttachedToWindow() 当view被附着到一个窗口时触发 。
13、onDetachedFromWindow() 当view离开附着的窗口时触发,Android123提示该方法和 onAttachedToWindow() 是相反的。
14、onWindowVisibilityChanged( int ) 当窗口中包含的可见的view发生变化时触发。

在这里插入图片描述

package com.example.myview;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.RectF;
import android.util.AttributeSet;
import android.view.View;

public class CoustomView extends View {
    Paint paint=new Paint();

    public CoustomView(Context context,AttributeSet attrs) {
        super(context, attrs);

        initPaint();
    }

    //初始化 画笔
    private void initPaint() {

        //是否抗锯齿
        paint.setAntiAlias(true);

        //设置画笔颜色额
        paint.setColor(Color.BLACK);
        //设置画笔的宽度 如果设置为0 默认就是1px
        paint.setStrokeWidth(2);
        //设置样式 当前描边不填充
        paint.setStyle(Paint.Style.STROKE);
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);

        //线
        canvas.drawLine(0,0,100,100,paint);

        //矩形
        RectF rectF=new RectF(100,100,200,200);

        canvas.drawRect(rectF,paint);

        //圆
        canvas.drawCircle(300,300,140,paint);
        //扇形
        RectF rectF1=new RectF(400,400,500,500);

        canvas.drawArc(rectF1,0,180,true,paint);

        //椭圆
        RectF rectF2=new RectF(400,380,600,600);

        canvas.drawOval(rectF2,paint);


    }
}

  <com.example.myview.CoustomView
      android:id="@+id/myview"
      android:layout_width="match_parent"
      android:layout_height="match_parent" />

在这里插入图片描述

package com.example.myview;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.RectF;
import android.util.AttributeSet;
import android.view.View;

public class DianShan extends View implements Runnable{

    Paint paint1=new Paint();
    Paint paint2=new Paint();
    Paint paint3=new Paint();
    Paint paint=new Paint();

    int start1;
    int start2;
    int start3;

    int width;
    int hight;
    public DianShan(Context context, AttributeSet attrs) {
        super(context, attrs);
        paint1.setColor(Color.BLUE);
        paint1.setStyle(Paint.Style.FILL);
        paint1.setStrokeWidth(2);
        paint1.setAntiAlias(true);

        paint2.setColor(Color.YELLOW);
        paint2.setStyle(Paint.Style.FILL);
        paint2.setStrokeWidth(2);
        paint2.setAntiAlias(true);

        paint3.setColor(Color.GREEN);
        paint3.setStyle(Paint.Style.FILL);
        paint3.setStrokeWidth(2);
        paint3.setAntiAlias(true);

        paint.setColor(Color.GRAY);
        paint.setStyle(Paint.Style.FILL);
        paint.setStrokeWidth(2);
        paint.setAntiAlias(true);
    }

    @Override
    protected void onSizeChanged(int w, int h, int oldw, int oldh) {
        super.onSizeChanged(w, h, oldw, oldh);
        this.hight=h;
        this.width=w;
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);

        RectF rectF1=new RectF(width/2-50,hight/2-125,width/2+50,hight/2-75);

        canvas.drawOval(rectF1,paint);
        canvas.drawLine(width/2,hight/2,width/2,hight/2-100,paint);
        RectF rectF=new RectF(-width/2,-width/2,width/2,width/2);
        canvas.translate((width/2),(hight/2));
        canvas.drawArc(rectF,start1,30,true,paint1);
        canvas.drawArc(rectF,start2,30,true,paint2);
        canvas.drawArc(rectF,start3,30,true,paint3);
    }

    @Override
    public void run() {
        while (true){

            start1+=1;
            start2=start1+120;
            start3=start2+120;
            postInvalidate();
            try {
                Thread.sleep(1);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值