自定義View實現雷達掃描倒計時功能

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


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);
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章