最近在做一个项目,其中有一个页面是要做一个类似于雷达扫描的效果,和网上看了很多种方法,发现代码量有点多,于是,自己弄了一个简单的。
话不多说,直接上代码
public class Vv extends View {
Handler handler=new Handler();
Paint paint;//绘制扇形的笔
Paint paint2;//绘制数字的笔
Paint paint3;//绘制框格和圆的笔
String str="10";//中间那个数,拼成string然后在绘制
int num=10;//中间那个数
int flag=0;//角度
public static int ofsent=10;//角度插值,累加速度越快
public static void setOfsent() {
ofsent+=10;
}
Runnable runnable=new Runnable() {
@TargetApi(Build.VERSION_CODES.KITKAT_WATCH)
@RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN)
@Override
public void run() {
if(flag>=360){
flag=0;
num--;
str=num+"";
}
flag+=ofsent;
if(!(num <=0)){
invalidate();//重绘
}else {
NotificationManager manager= (NotificationManager) getContext().getSystemService(Context.NOTIFICATION_SERVICE);
Notification.Builder builder=new Notification.Builder(getContext());
builder.setSmallIcon(R.mipmap.ic_launcher);
builder.setContentTitle("提示:");
builder.setContentText("倒计时完成进入主页面");
manager.notify(1,builder.build());
builder.setSortKey(Notification.CATEGORY_ALARM);
Intent intent=new Intent(getContext(),Main2Activity.class);
getContext().startActivity(intent);
}
}
};
public Vv(Context context) {
super(context);
}
public Vv(Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
paint=new Paint();
paint.setColor(Color.parseColor("#BF022D50"));
paint2=new Paint();
paint2.setColor(Color.parseColor("#068AF5"));
paint2.setStrokeWidth(10);
paint2.setStyle(Paint.Style.STROKE);
paint3=new Paint();
paint3.setColor(Color.parseColor("#78CFF7"));
paint3.setTextSize(300);
paint3.setStrokeWidth(10);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
canvas.drawLine(0,getWidth()/2,getWidth(),getHeight()/2,paint2);
canvas.drawLine(getWidth()/2,0,getWidth()/2,getHeight(),paint2);
canvas.drawCircle(getWidth()/2,getWidth()/2,150,paint2);
canvas.drawCircle(getWidth()/2,getWidth()/2,250,paint2);
RectF rectF=new RectF(-150,-150,getWidth()+150,getWidth()+150);
paint3.setTextAlign(Paint.Align.CENTER);
Paint.FontMetrics fontMetrics = paint3.getFontMetrics();
float top = fontMetrics.top;//为基线到字体上边框的距离,即上图中的top
float bottom = fontMetrics.bottom;//为基线到字体下边框的距离,即上图中的bottom
int baseLineY = (int) (rectF.centerY() - top/2 - bottom/2);//基线中间点的y轴计算公式
canvas.drawText(str,rectF.centerX(),baseLineY,paint3);
canvas.drawArc(rectF,0,flag,true,paint);
handler.postDelayed(runnable,100);//延迟发送 后重绘,改变绘制扇形的角度
}
@Override
public boolean onTouchEvent(MotionEvent event) {
if(event.getAction()==MotionEvent.ACTION_DOWN){
setOfsent();
}
return super.onTouchEvent(event);
}
}