绘制一个随着时间变化的圆盘,改组件只是显示变化的图层
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(); } }
相关推荐
Plplot绘制随时间变换的动态图
D-一个关于Drawer绘图的小例子根据时间变化图案也会随之发生变化图案自动生成.rar
绘制波形图,随时间向前不断移动,曲线可以另存为, 绘制动态曲线 数据采集 通讯
环境:VS2017+Qt5.14.2 环境匹配可以运行成功 功能: 1:实现了基本的图形:矩形、正方形、圆形、三角形、多线段、...鼠标按下后开始绘制,再次按下后停止绘制。 3:图形的拖拽、删除、撤销操作 4:曲线图形实时绘制。
Android中View绘制流程
自定义view 画笔绘制记录一下而已,好记性不如烂笔头
利用matlab对RHR的降温曲线进行绘制,并计算给出了进入换热器的流量温度随时间的变化关系基于matlab实现换热器的流量温度随时间的变化关系仿真源码(课程作业).zip 利用matlab对RHR的降温曲线进行绘制,并计算给出了...
在使用QGraphicsView过程中,有时候我们需要对view进行缩放,但是对于一般正常的加入view中的item都会随着view的大小变化而变化,但是如果我们想让某些item不随view的缩放进行改变怎么办呢?详情见博客:...
详细介绍了Android View绘制过程
这是一个QT的demo,可以用鼠标进行矩形的绘制,根据这个demo也可以绘制出其他的多边形 QT版本:5.15.2 VS版本:2019 1、鼠标绘制一个或多个矩形 2、鼠标放在矩形上可以按住拖动 3、鼠标放在矩形边缘可以拉长或拉短...
VB曲线源码,举例了几个图片,全部是代码。
在之前介绍PyQtGraph的文章中,我们都是一次性的获取数据并将其绘制为图形。然而在很多场景中,我们都需要对实时的数据进行图形化展示,比如:股票的实时行情、仪器设备的实时状态等,...通过实时变化的CPU利用率图形,
绘制曲线,利用matlab 经典教程不错阿偶
类似于miui安全中心圆盘效果
Matlab绘制振幅反射率和透射率随入射角度的变化曲线.rar
适合opengl初学人群
通过QT中 QPainter来绘制的一个监控回放时间轴demo,实现了年 月 日 时的显示、缩放与拖拽(之前上传一个版本发现有bug,该版本为修复后的版本)
Android自定义View实战---圆盘温度计
Android自定义View基本绘制流程及实例
matlab绘图总结,这篇将介绍一些论文绘图中经常碰到的问题,如在一个数量很大的曲线上做标记,平滑一个数据量很少的曲线,绘制面积图,以及如何改进绘图的美感。...