画弧

本文介绍了一个自定义ViewGroup实现的PictureLayout,用于演示如何在Android中使用Canvas进行绘图操作,包括绘制矩形、弧形等,并展示了如何利用Picture记录和回放绘图过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

画图主要是在View的onDraw(Canvas canvas)操作

该例中的drawPict不起作用

package com.example.androidtest;

import android.os.Bundle;
import android.app.Activity;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Picture;
import android.graphics.Rect;
import android.graphics.RectF;
import android.graphics.drawable.Drawable;
import android.util.AttributeSet;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewParent;

class PictureLayout extends ViewGroup
{
	private final Picture mPicture = new Picture();
	
	public PictureLayout(Context context)
	{
		super(context);
	}
	
	public PictureLayout(Context context, AttributeSet attrs)
	{
		super(context, attrs);
	}
	
	protected void onLayout(boolean changed, int l, int t, int r, int b)
	{
		final int count = super.getChildCount();
		
		for (int i = 0; i < count; i++) {
			final View child = getChildAt(i);
			if (child.getVisibility() != GONE) {
				final int childLeft = getPaddingLeft();
				final int childTop = getPaddingTop();
				child.layout(childLeft, childTop, childLeft + child.getMeasuredWidth(), childTop + child.getMeasuredHeight());
			}
		}
	}
	
	public void addView(View child)
	{
		if (getChildCount() > 1) {
			throw new IllegalStateException("PictureLayout can host only direct child");
		}
		
		super.addView(child);
	}
	
	public void addView(View child, int index)
	{
		if (getChildCount() > 1) {
			throw new IllegalStateException("PictureLayout can host only one direct child");
		}
		
		super.addView(child, index);
	}
	
	public void addView(View child, LayoutParams params)
	{
		if (getChildCount() > 1) {
			throw new IllegalStateException("PictureLayout can host only one direct child");
		}
		
		super.addView(child, params);
	}
	
	public void addView(View child, int index, LayoutParams params)
	{
		if (getChildCount() > 1) {
			throw new IllegalStateException("PictureLayout can host only one direct child");
		}
		
		super.addView(child, index, params);
	}
	
	protected LayoutParams generateDefaultParams()
	{
		return new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);
	}
	
	protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec)
	{
		final int count = getChildCount();
		
		int maxHeight = 0;
		int maxWidth = 0;
		
		for (int i = 0; i < count; i++) {
			final View child = getChildAt(i);
			if (child.getVisibility() != GONE) {
				measureChild(child, widthMeasureSpec, heightMeasureSpec);
			}
		}
		
		maxWidth += getPaddingLeft() + getPaddingRight();
		maxHeight += getPaddingTop() + getPaddingBottom();
		
		Drawable drawable = getBackground();
		if (drawable != null) {
			maxHeight = Math.max(maxHeight, drawable.getMinimumHeight());
			maxWidth = Math.max(maxWidth, drawable.getMinimumWidth());
		}
		
		setMeasuredDimension(resolveSize(maxWidth, widthMeasureSpec), resolveSize(maxHeight, heightMeasureSpec));
	}
	
	private void drawPict(Canvas canvas, int x, int y, int w, int h, float sx, float sy)
	{
		canvas.save();
		canvas.translate(x, y);
		canvas.clipRect(0, 0, w, h);
		canvas.scale(0.5f, 0.5f);
		canvas.scale(sx,  sy, w, h);
		canvas.drawPicture(mPicture);
		canvas.restore();
	}
	
	protected void dispatchDraw(Canvas canvas)
	{
		super.dispatchDraw(mPicture.beginRecording(getWidth(), getHeight()));
		mPicture.endRecording();
		
		int x = getWidth() / 2;
		int y = getHeight() / 2;
		
		if (false) {
			drawPict(canvas, 0, 0, x, y, 1, 1);
			drawPict(canvas, x, 0, x, y, -1, 1);
			drawPict(canvas, 0, y, x, y, 1, -1);
			drawPict(canvas, x, y, x, y, -1, -1);
			
		}
	}
	
	public ViewParent invalidateChildParent(int[] location, Rect dirty)
	{
		location[0] = getLeft();
		location[1] = getTop();
		dirty.set(0, 0, getWidth(), getHeight());
		
		return getParent();
	}
}


class GraphicsActivity extends Activity
{
	private static final boolean TEST_PICTURE = false;
	
	protected void onCreate(Bundle savedInstanceState)
	{
		super.onCreate(savedInstanceState);
	}
	
	public void setContentView(View view)
	{
		if (TEST_PICTURE) {
			ViewGroup vg = new PictureLayout(this);
			vg.addView(view);
			view = vg;
		}
		
		super.setContentView(view);
	}
}

public class MainActivity extends GraphicsActivity {
	
	@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
     
        setContentView(new SampleView(this));   
    }   
	
	private static class SampleView extends View
	{
		private Paint[] mPaints;
		private Paint mFramePaint;
		private boolean[] mUseCenters;
		private RectF[] mOvals;
		private RectF mBigOval;
		private float mStart;
		private float mSweep;
		private int mBigIndex;
		
		private static final float SWEEP_INC = 2;
		private static final float START_INC = 2;
		
		public SampleView(Context context)
		{
			super(context);
			
			mPaints = new Paint[4];
			mUseCenters = new boolean[4];
			mOvals = new RectF[4];
			
			mPaints[0] = new Paint();
			mPaints[0].setAntiAlias(true);
			mPaints[0].setStyle(Paint.Style.FILL);
			mPaints[0].setColor(0x88ff0000);
			mUseCenters[0] = false;
			
			mPaints[1] = new Paint(mPaints[0]);
			mPaints[1].setColor(0x8800ff00);
			mUseCenters[1] = true;
			
			mPaints[2] = new Paint(mPaints[0]);
			mPaints[2].setStyle(Paint.Style.STROKE);
			mPaints[2].setStrokeWidth(4);
			mPaints[2].setColor(0x880000ff);
			mUseCenters[2] = false;
			
			mPaints[3] = new Paint(mPaints[2]);
			mPaints[3].setColor(0x88888888);
			mUseCenters[3] = true;
			
			mBigOval = new RectF(40, 10, 280, 250);
			mOvals[0] = new RectF(10, 270, 70, 330);
			mOvals[1] = new RectF(90, 270, 150, 330);
			mOvals[2] = new RectF(170, 270, 230, 330);
			mOvals[3] = new RectF(250, 270, 310, 330);
			
			mFramePaint = new Paint();
			mFramePaint.setAntiAlias(true);
			mFramePaint.setStyle(Paint.Style.STROKE);
			mFramePaint.setStrokeWidth(0);
		}
		
		private void drawArcs(Canvas canvas, RectF oval, boolean useCenter, Paint paint)
		{
			canvas.drawRect(oval, mFramePaint);
			canvas.drawArc(oval, mStart, mSweep, useCenter, paint);
		}
		
		protected void onDraw(Canvas canvas)
		{
			canvas.drawColor(Color.WHITE);
			
			drawArcs(canvas, mBigOval, mUseCenters[mBigIndex], mPaints[mBigIndex]);
			
			for (int i = 0; i < 4; i++) {
				drawArcs(canvas, mOvals[i], mUseCenters[i], mPaints[i]);
			}
			
			mSweep += SWEEP_INC;
			if (mSweep > 360) {
				mSweep -= 360;
				mStart += START_INC;
				if (mStart >= 360) {
					mStart -= 360;
				}
				
				mBigIndex = (mBigIndex + 1) % mOvals.length;
			}
			
			invalidate();
		}
	}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

kgduu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值