Android自定义view画五星红旗
效果图:
布局:
<com.example.day03_view_demo.StarFlagView android:layout_height="match_parent" android:layout_width="match_parent" />
、、
java代码:
public class StarFlagView extends SurfaceView implements SurfaceHolder.Callback ,Runnable{ private final static int STAR_COLOR = 0xffffff00; private final static int BACK_COLOR = 0xffff0000; private SurfaceHolder mHolder; private boolean isStop = false; private Thread mThread; private Path mBigStarPath; private Path[] mSmallStarsPath; private Paint mStarPaint; private int mWidth, mHeight; private Paint mBackPaint; public StarFlagView(Context context) { super(context); init(null, 0); } public StarFlagView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); init(attrs, defStyle); } public StarFlagView(Context context, AttributeSet attrs) { super(context, attrs); init(attrs, 0); } private void init(AttributeSet attrs, int defStyle) { mHolder = getHolder(); mHolder.addCallback(this); setFocusable(true); setFocusableInTouchMode(true); setZOrderOnTop(true); mHolder.setFormat(PixelFormat.TRANSPARENT);// 设置背景透明 mThread = new Thread(this); } public void run() { Canvas canvas = null; while (!isStop) { try { canvas = mHolder.lockCanvas(); canvas.drawColor(Color.BLACK, PorterDuff.Mode.CLEAR);// 清除屏幕 canvas.drawRect(0, 0, mWidth, mHeight, mBackPaint); canvas.drawPath(mBigStarPath, mStarPaint); for (int i = 0; i < mSmallStarsPath.length; i++) { canvas.drawPath(mSmallStarsPath[i], mStarPaint); } } catch (Exception e) { e.printStackTrace(); } finally { if (canvas != null) { mHolder.unlockCanvasAndPost(canvas); } } try { Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } } } public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { } public void surfaceCreated(SurfaceHolder holder) { // 大圆中心点 int width = getWidth(); int height = getHeight(); if (width * 2 / 3 > height) { width = height / 2 * 3; } else { height = width / 3 * 2; } int cellWidth = width / 30; mWidth = width; mHeight = height; // 大五角星路径 mBigStarPath = createStarPath(new PointF(width / 6, height / 4), width / 10, -90); // 小五角星路径 mSmallStarsPath = new Path[4]; mSmallStarsPath[0] = createStarPath(new PointF(cellWidth * 10, cellWidth * 2), cellWidth, (float) (Math.atan2(3, -5) / Math.PI * 180)); mSmallStarsPath[1] = createStarPath(new PointF(cellWidth * 12, cellWidth * 4), cellWidth, (float) (Math.atan2(1, -7) / Math.PI * 180)); mSmallStarsPath[2] = createStarPath(new PointF(cellWidth * 12, cellWidth * 7), cellWidth, (float) (Math.atan2(-2, 7) / Math.PI * 180)); mSmallStarsPath[3] = createStarPath(new PointF(cellWidth * 10, cellWidth * 9), cellWidth, (float) (Math.atan2(-4, 5) / Math.PI * 180-90)); mStarPaint = new Paint(); mStarPaint.setColor(STAR_COLOR); mStarPaint.setStyle(Paint.Style.FILL); mStarPaint.setAntiAlias(true);// 抗锯齿 mBackPaint = new Paint(); mBackPaint.setColor(BACK_COLOR); mBackPaint.setStyle(Paint.Style.FILL); mThread.start(); } public void surfaceDestroyed(SurfaceHolder holder) { isStop = true; } private Path createStarPath(PointF centerPointF, float radius, float rotate) { final double arc = Math.PI / 5; final double rad = Math.sin(Math.PI / 10) / Math.sin(3 * Math.PI / 10); Path path = new Path(); path.moveTo(1, 0); for (int idx = 0; idx < 5; idx++) { path.lineTo((float) (rad * Math.cos((1 + 2 * idx) * arc)), (float) (rad * Math.sin((1 + 2 * idx) * arc))); path.lineTo((float) (Math.cos(2 * (idx + 1) * arc)), (float) (Math.sin(2 * (idx + 1) * arc))); } path.close(); Matrix matrix = new Matrix(); matrix.postRotate(rotate); matrix.postScale(radius, radius); matrix.postTranslate(centerPointF.x, centerPointF.y); path.transform(matrix); return path; } }