自定义View随笔

147 阅读2分钟

首次编写,不足请谅解

问题1:自定义View中,没有出现预期图像

可能原因1:相关绘制设置没有进行或者位置错误,例如:自定义View的java或者kt文件直接在XML文件中进行插入,而没有在第二个构造方法中进行画笔等设置的初始化

涉及相关知识:自定义View的三个重要的构造方法

以以下代码为例:

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Point;
import android.graphics.Rect;
import android.util.AttributeSet;
import android.util.DisplayMetrics;
import android.view.Display;
import android.view.View;
import android.view.WindowManager;

import androidx.annotation.Nullable;

/**
 * @author 
 * @description:
 * @date :2022/4/26 21:18
 */
public class AnimView extends View {

    Paint mPaint;
    Rect mRect;
    int mWidth;
    int mHeight;

    private void getScreenSize(){
        WindowManager windowManager = (WindowManager)getContext().getSystemService(Context.WINDOW_SERVICE);
        DisplayMetrics displayMetrics = new DisplayMetrics();
        windowManager.getDefaultDisplay().getMetrics(displayMetrics);
        mWidth = displayMetrics.widthPixels;
        mHeight = displayMetrics.heightPixels;
    }

    private void getScreenSizeTwo(){
        //获取屏幕物理宽高
        Point point = new Point();
        WindowManager windowManager = (WindowManager)getContext().getSystemService(Context.WINDOW_SERVICE);
        Display display = windowManager.getDefaultDisplay();
        display.getSize(point);
        mWidth = point.x;
        mHeight = point.y;
    }

    private void init(){
        getScreenSize();
        mPaint = new Paint();
        mPaint.setAntiAlias(true);
        mPaint.setStyle(Paint.Style.FILL);
        mPaint.setColor(Color.BLUE);
        mRect = new Rect();
        mRect.top = 0;
        mRect.left = 0;
        mRect.right = mWidth / 2;
        mRect.bottom = mHeight / 2;
    }

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

    public AnimView(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
        init();
    }

    public AnimView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        init();
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        canvas.drawRect(mRect, mPaint);
    }

    @Override
    protected void onSizeChanged(int w, int h, int oldw, int oldh) {
        super.onSizeChanged(w, h, oldw, oldh);
        mHeight = h;
        mWidth = w;
    }
}

每一个构造函数的调用时机都有所区别,因此,需要特别注意初始化设置的位置,如果心大,那就像例子中的一样,每一个都放上吧=.=

  1. 对于第一个构造函数而言,是在代码中采用new的方式创建对象的时候才会调用的,不常用,因为不灵活

  2. 对于第二个构造函数而言,是在xml文件中进行插入的时候才会调用的,通过AttributeSet attrs获取到xml文件的属性

  3. 对于第三个构造函数而言,是个笨比,不会主动调用,需要我们手动在第二个构造方法中进行调用,并且是在有相关参数设定的时候才会采取的行动,即我们定义了一个style,然后可以通过int defStyleAttr进行获取。

后续有所补充的相关知识也会进行总结,因此,嘿嘿,未完待续...