`
万般皆散
  • 浏览: 17291 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

绘制随时间变化的圆盘view

阅读更多

绘制一个随着时间变化的圆盘,改组件只是显示变化的图层

import java.util.Timer;
import java.util.TimerTask;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Matrix;
import android.graphics.Paint;
import android.graphics.Path;
import android.graphics.RectF;
import android.graphics.Region;
import android.util.AttributeSet;
import android.view.View;
import com.letv.tvos.lechou.R;
import com.letv.tvos.lechou.utils.LogCat;

public class SweepAngle extends View {

	private Timer timer;
	private int endAngle;
	private float startAngle;
	private Bitmap bitmapSrc,bitmapNew;
	private Paint paint;
	private int interval = 1000;
	private OnRetainingTimeFinishListener onRetainingTimeFinishListener;

	public SweepAngle(Context context) {
		this(context, null);
	}

	public SweepAngle(Context context, AttributeSet attrs) {
		super(context, attrs);
		this.setLayerType(View.LAYER_TYPE_SOFTWARE, null);
		paint = new Paint(); // 笔触
		paint.setAntiAlias(true); // 反锯齿
	}

	@Override
	protected void onDraw(Canvas canvas) {
		super.onDraw(canvas);

		if(bitmapSrc == null){
			return;
		}
		canvas.rotate(-90, getWidth() / 2, getHeight() / 2);
		
		canvas.save();
		
		getSectorClip(canvas, 
				(float)getWidth() / 2, 
				(float)getHeight() / 2, 
				bitmapNew.getHeight() / 2,
				startAngle, endAngle);
		
		canvas.drawBitmap(bitmapNew, 0, 0, paint);

		
		
		canvas.restore();

	}

	public void show(int endAngle) {
		this.endAngle = endAngle;
		this.post(new Runnable() {

			@Override
			public void run() {
				initParams();
			}
		});

	}

	private void initParams() {
		bitmapSrc = BitmapFactory.decodeResource(getResources(), R.drawable.bg_retaining_time_mid);
		
		// 获得图片的宽高
		int width = bitmapSrc.getWidth();
		int height = bitmapSrc.getHeight();
		
		LogCat.e("width : " + width);
		LogCat.e("height : " + height);
		// 设置想要的大小
		int padding = getResources().getDimensionPixelSize(R.dimen.s_6);
		int newWidth = getWidth() - padding;
		int newHeight = getHeight() - padding;
		// 计算缩放比例
		float scaleWidth = ((float) newWidth) / width;
		float scaleHeight = ((float) newHeight) / height;
		// 取得想要缩放的matrix参数
		Matrix matrix = new Matrix();
		matrix.postScale(scaleWidth, scaleHeight);
		// 得到新的图片
		bitmapNew = Bitmap.createBitmap(bitmapSrc, 0, 0, width, height, matrix,
				true);
		if(bitmapSrc.isRecycled()){
			bitmapSrc.recycle();
		}
		
		timer = new Timer();
		timer.schedule(new MyTimerTask(), interval, interval);
	}
	
	public void setInterval(int interval){
		this.interval = interval;
	}

	private class MyTimerTask extends TimerTask {

		@Override
		public void run() {
			// 如果endAngle 没有旋转一周,那么变增加3°
			if (endAngle < 360) {
				endAngle += 3;
				postInvalidate();
			} else {
				closeTask();
				if(onRetainingTimeFinishListener != null){
					onRetainingTimeFinishListener.onRetainingTimeFinish();
				}

			}
		}
	}

	
	public interface OnRetainingTimeFinishListener{
		void onRetainingTimeFinish();
	}
	
	
	
	public void setOnRetainingTimeFinishListener(
			OnRetainingTimeFinishListener onRetainingTimeFinishListener) {
		this.onRetainingTimeFinishListener = onRetainingTimeFinishListener;
	}

	/**
	 * 返回剩余的时间 单位 分钟
	 * 
	 * @return
	 */
	public int getRemainingTime() {
		return endAngle;
	}
	
	/**
	 * 停止转动
	 */
	public int closeTask(){
		if(timer != null){
			timer.cancel();
			timer = null;
		}
		if(bitmapSrc!= null && bitmapSrc.isRecycled()){
			bitmapSrc.recycle();
		}
		return endAngle;
	}
	

	/**
	 * 开始计时 params:时间间隔 毫秒
	 */
	public void startComputeTime() {
		// 开启绘制线程
		if (timer == null) {
			timer = new Timer();
			timer.schedule(new MyTimerTask(), interval, interval);
		} else {
			timer.cancel();
			timer = null;
			timer = new Timer();
			timer.schedule(new MyTimerTask(), interval, interval);
		}
	}

	private void getSectorClip(Canvas canvas, float center_X, float center_Y,
			float r, float startAngle, float sweepAngle) {

		Path path = new Path();

		// 下面是获得一个三角形的剪裁区
		path.moveTo(center_X, center_Y); // 圆心

		path.lineTo(
				(float) (center_X + r * Math.cos(startAngle * Math.PI / 180)), // 起始点角度在圆上对应的横坐标

				(float) (center_Y + r * Math.sin(startAngle * Math.PI / 180))); // 起始点角度在圆上对应的纵坐标

		path.lineTo(
				(float) (center_X + r * Math.cos(sweepAngle * Math.PI / 180)), // 终点角度在圆上对应的横坐标

				(float) (center_Y + r * Math.sin(sweepAngle * Math.PI / 180))); // 终点点角度在圆上对应的纵坐标

		path.close();

		// //设置一个正方形,内切圆
		RectF rectF = new RectF(center_X - r, center_Y - r, center_X + r,
				center_Y + r);

		// 下面是获得弧形剪裁区的方法
		path.addArc(rectF, startAngle, sweepAngle - startAngle);

		canvas.clipPath(path, Region.Op.REPLACE);
		
		path.close();

	}
	


}

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics