Lo estudié esta semana, controles personalizados. Método de pintura , leí el blog del gran dios antes, y siempre he tenido una pregunta, el uso de RecF(), simplemente no lo he entendido. Tomó un poco de tiempo hoy, y probablemente aprendí un poco al respecto a través de pruebas personales.
Ver comentarios del código fuente
Rect F contiene cuatro coordenadas flotantes para un rectángulo. El rectángulo
está representado por las coordenadas de sus 4 bordes (izquierda, arriba,
abajo a la derecha). A estos campos se puede acceder directamente. Use ancho () y
alto () para recuperar el ancho y alto del rectángulo. Nota:
la mayoría de los métodos no verifican que las coordenadas estén ordenadas
correctamente (es decir, izquierda <= derecha y arriba <= abajo).El rectángulo F contiene cuatro rectángulos de coordenadas flotantes. Las coordenadas del rectángulo representan los 4 lados (izquierda, arriba, abajo a la derecha). A estos campos se puede acceder directamente. Utilice width() y height() para recuperar el ancho y el alto del rectángulo. Nota: la mayoría de los métodos no verifican si las coordenadas están (es decir, ordenadas correctamente, por ejemplo, Izquierda <
= Derecha y Arriba <= Abajo).
Lo anterior es el comentario de archivo de todo el código fuente.
Según tengo entendido, primero mira el código.
public class LoadingView extends View {
private int mWidth;
private int mHeight;
public LoadingView(Context context) {
this(context, null);
}
public LoadingView(Context context, @Nullable AttributeSet attrs) {
this(context, attrs, 0);
}
public LoadingView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
int widthSize = MeasureSpec.getSize(widthMeasureSpec);
int widthMode = MeasureSpec.getMode(widthMeasureSpec);
int heightSize = MeasureSpec.getSize(heightMeasureSpec);
int heightMode = MeasureSpec.getMode(heightMeasureSpec);
if (widthMode == MeasureSpec.EXACTLY) {
//当画布的大小为明确值MATCH_CONTENT
mWidth = widthSize;
} else {
mWidth = SizeUtils.dp2px(200);
}
if (heightMode == MeasureSpec.EXACTLY) {
//
mHeight = heightSize;
} else {
mHeight = SizeUtils.dp2px(200);
}
setMeasuredDimension(mWidth, mHeight);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
Paint paint = new Paint();
paint.setAntiAlias(true);//消除锯齿
paint.setStrokeWidth(1);//设置画笔的宽度
paint.setStyle(Paint.Style.STROKE);//设置绘制轮廓
paint.setColor(Color.parseColor("#2EA4F2"));//设置颜色
RectF rectF = new RectF(SizeUtils.dp2px(75), SizeUtils.dp2px(75), SizeUtils.dp2px(125), SizeUtils.dp2px(125));
canvas.drawRect(rectF, paint);
}
}
representaciones
Dibujado según mi propio entendimiento.
Podemos ver que hay cuatro puntos A, B, C y D, que corresponden a un punto en el método RectF(float left, float top, float right, float bottom) . Sin embargo, el ancho del rectángulo en el medio es ancho=C(derecha)-A(izquierda), alto=D(abajo)-B(arriba)
El efecto de la imagen se debe principalmente a que quiero lucir bien, así que dibujo los gráficos en el medio del lienzo. El valor del rectángulo se puede probar por sí mismo.