最近在做一個項目,其中有一個頁面是要做一個類似於雷達掃描的效果,和網上看了很多種方法,發現代碼量有點多,於是,自己弄了一個簡單的。
話不多說,直接上代碼
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);
}
}