首次编写,不足请谅解
问题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;
}
}
每一个构造函数的调用时机都有所区别,因此,需要特别注意初始化设置的位置,如果心大,那就像例子中的一样,每一个都放上吧=.=
-
对于第一个构造函数而言,是在代码中采用new的方式创建对象的时候才会调用的,不常用,因为不灵活
-
对于第二个构造函数而言,是在xml文件中进行插入的时候才会调用的,通过AttributeSet attrs获取到xml文件的属性
-
对于第三个构造函数而言,是个笨比,不会主动调用,需要我们手动在第二个构造方法中进行调用,并且是在有相关参数设定的时候才会采取的行动,即我们定义了一个style,然后可以通过int defStyleAttr进行获取。
后续有所补充的相关知识也会进行总结,因此,嘿嘿,未完待续...