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