本文共 4200 字,大约阅读时间需要 14 分钟。
以下是Android开发中自定义TriangleView视图的实现代码,详细说明了如何创建一个可自定义的三角形视图。
import android.content.Context;import android.content.res.TypedArray;import android.graphics.Canvas;import android.graphics.Color;import android.graphics.Paint;import android.graphics.Path;import android.support.annotation.IntDef;import android.support.annotation.Nullable;import android.util.AttributeSet;import android.view.View;import java.lang.annotation.Retention;import java.lang.annotation.RetentionPolicy;/** * 三角形 */public class TriangleView extends View{ private Paint paint; private Path path; private int color; private int mode; private final int DEFAULT_WIDTH=48; private final int DEFAULT_HEIGHT=24; private int width = 0; private int height =0; /** * 倒三角 */ public static final int INVERTED = 0; /** * 正三角 */ public static final int REGULAR = 1; @IntDef({INVERTED, REGULAR}) @Retention(RetentionPolicy.SOURCE) public @interface ShapeMode {} public TriangleView(Context context) { this(context,null); } public TriangleView(Context context, @Nullable AttributeSet attrs) { this(context,attrs,0); } public TriangleView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); init(context,attrs); } private void init(Context context,AttributeSet attrs){ TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.TriangleView); color = typedArray.getColor(R.styleable.TriangleView_tlv_color, Color.BLACK); mode = typedArray.getInt(R.styleable.TriangleView_tlv_mode, INVERTED); typedArray.recycle(); paint = new Paint(); paint.setColor(color); paint.setAntiAlias(true); paint.setStyle(Paint.Style.FILL); path= new Path(); } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); width = measureSize(widthMeasureSpec, DEFAULT_WIDTH); height = measureSize(heightMeasureSpec, DEFAULT_HEIGHT); setMeasuredDimension(width, height); } private int measureSize(int measureSpec, int defaultSize) { int newSize = 0; int mode = MeasureSpec.getMode(measureSpec); int size = MeasureSpec.getSize(measureSpec); switch (mode) { case MeasureSpec.AT_MOST: newSize = Math.min(size, defaultSize); break; case MeasureSpec.EXACTLY: newSize = size; break; case MeasureSpec.UNSPECIFIED: newSize = defaultSize; break; } return newSize; } public void setColor(int color){ this.color=color; paint.setColor(color); invalidate(); } public void setMode(@ShapeMode int mode){ this.mode=mode; invalidate(); } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); drawTriangle(canvas); } private void drawTriangle(Canvas canvas) { if(mode==INVERTED) { path.moveTo(0f, 0f); path.lineTo(width, 0f); path.lineTo(width / 2.0f, height); } else { path.moveTo(width/2.0f,0f); path.lineTo(0,height); path.lineTo(width,height); } path.close(); canvas.drawPath(path, paint); } 该TriangleView类实现了一个可自定义的三角形视图,主要包括以下几个方面:
具体实现细节如下:
1. 自定义属性定义:在TriangleView类中,我们定义了两个主要的自定义属性:
tlv_mode: 用于指定三角形的形态,支持两种模式:
inverted: 倒三角(默认)
regular: 正三角
tlv_color: 用于指定三角形的填充颜色,可通过format属性指定格式(如“color|reference”)
2. 类初始化:在类初始化时,通过读取属性文件获取自定义属性的值,并初始化绘图工具(paint和path)
color属性设置为默认颜色BLACK
mode属性设置为默认倒三角模式INVERTED
3. 自适应测量:通过onMeasure方法实现视图的尺寸自适应,根据MeasureSpec获取宽度和高度,并设置最终的测量尺寸
measureSize方法根据MeasureSpec模式(AT_MOST、EXACTLY、UNSPECIFIED)计算最终的尺寸值
4. 绘图实现:在onDraw方法中调用drawTriangle方法进行绘制
根据mode的不同,绘制倒三角或正三角的路径
通过Path对象实现多点连接,最后闭合路径并用Paint进行填充绘制
5. 模式切换和颜色设置:提供setMode和setColor方法供外部调用,切换模式或改变颜色后自动刷新视图
通过invalid方法触发视图重绘确保UI更新
整个实现过程注重代码的简洁性和可维护性,通过合理的属性设置和方法设计,实现了高度的可定制性
转载地址:http://ftbfz.baihongyu.com/