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