绘制一个随着时间变化的圆盘,改组件只是显示变化的图层
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(); } }