美文网首页
Android--垃圾桶控件

Android--垃圾桶控件

作者: aruba | 来源:发表于2020-01-21 09:28 被阅读0次
    binView.gif
    运用Path和Canvas旋转实现的效果
    /**
     * 垃圾桶
     */
    public class BinView extends View {
        private Paint mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
        private Bitmap bottomBitmap;
        //下面的高度
        private int bottomHeight = 50;
        //盖子宽度
        private int gaiziWidth = 100;
        //盖子初始Y坐标
        private int gaiziOffset;
        private Path gaiziPath;
        //旋转角度
        private float rotate = 1;
    
        public BinView(Context context) {
            super(context);
        }
    
        public BinView(Context context, @Nullable AttributeSet attrs) {
            super(context, attrs);
            mPaint.setStyle(Paint.Style.STROKE);
            mPaint.setColor(Color.BLACK);
            mPaint.setStrokeWidth(5);
            mPaint.setStrokeCap(Paint.Cap.ROUND);
        }
    
        @Override
        protected void onDraw(Canvas canvas) {
            int centerX = canvas.getWidth() / 2;
            int centerY = canvas.getHeight() / 2;
    
            if (bottomBitmap == null) {//缓冲
                bottomBitmap = Bitmap.createBitmap(getMeasuredWidth(), getMeasuredHeight(), Bitmap.Config.ARGB_8888);
                Canvas bottomCanvas = new Canvas(bottomBitmap);
    
                //画中间三条竖线
                int spac = 10;//每条线的间距
    
                Path path1 = new Path();
                path1.moveTo(centerX, centerY);
                path1.lineTo(centerX, centerY + bottomHeight);
    
                Path path2 = new Path();
                path2.moveTo(centerX - spac, centerY);
                path2.lineTo(centerX - spac, centerY + bottomHeight);
    
                Path path3 = new Path();
                path3.moveTo(centerX + spac, centerY);
                path3.lineTo(centerX + spac, centerY + bottomHeight);
    
                bottomCanvas.drawPath(path1, mPaint);
                bottomCanvas.drawPath(path2, mPaint);
                bottomCanvas.drawPath(path3, mPaint);
    
                //底部
                int bottomWidth = 40;
                Path path4 = new Path();
                path4.moveTo(centerX - bottomWidth / 2, centerY + spac + bottomHeight);
                path4.lineTo(centerX + bottomWidth / 2, centerY + spac + bottomHeight);
                bottomCanvas.drawPath(path4, mPaint);
    
                //画左边斜线
                bottomCanvas.save();
                bottomCanvas.rotate(-15, centerX - bottomWidth / 2, centerY + spac + bottomHeight);
                Path path5 = new Path();
                path5.moveTo(centerX - bottomWidth / 2, centerY + spac + bottomHeight);
                path5.lineTo(centerX - bottomWidth / 2, centerY - spac);
                bottomCanvas.drawPath(path5, mPaint);
                bottomCanvas.restore();
    
                //画右边斜线
                bottomCanvas.save();
                bottomCanvas.rotate(15, centerX + bottomWidth / 2, centerY + spac + bottomHeight);
                Path path6 = new Path();
                path6.moveTo(centerX + bottomWidth / 2, centerY + spac + bottomHeight);
                path6.lineTo(centerX + bottomWidth / 2, centerY - spac);
                bottomCanvas.drawPath(path6, mPaint);
                bottomCanvas.restore();
    
                gaiziOffset = spac;
            }
    
            //画底部缓冲
            canvas.drawBitmap(bottomBitmap, 0, 0, mPaint);
            //画盖子
            if (gaiziPath == null) {
                gaiziPath = new Path();
                gaiziPath.moveTo(centerX - gaiziWidth / 2, centerY - gaiziOffset);
                gaiziPath.lineTo(centerX + gaiziWidth / 2, centerY - gaiziOffset);
                int gaiziHeadWidth = 10;
                gaiziPath.addRect(centerX - gaiziHeadWidth, centerY - gaiziHeadWidth - gaiziOffset, centerX + gaiziHeadWidth, centerY - gaiziOffset, Path.Direction.CW);
            }
            canvas.save();
            canvas.rotate(45 * (1 - rotate), centerX + gaiziWidth / 2, centerY - gaiziOffset);
            canvas.drawPath(gaiziPath, mPaint);
            canvas.restore();
        }
    
        @Override
        public boolean onTouchEvent(MotionEvent event) {
            if (event.getAction() == MotionEvent.ACTION_DOWN) {
                startAnime();
            }
            return super.onTouchEvent(event);
        }
    
        private ValueAnimator valueAnimator;
    
        public void startAnime() {
            if (valueAnimator == null) {
                valueAnimator = ValueAnimator.ofFloat(1);
                valueAnimator.setInterpolator(new LinearInterpolator());
                valueAnimator.setDuration(1000);
                valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
                    @Override
                    public void onAnimationUpdate(ValueAnimator animation) {
                        rotate = (float) animation.getAnimatedValue();
                        postInvalidate();
                    }
                });
            }
    
            valueAnimator.start();
        }
    }
    
    项目地址:https://gitee.com/aruba/CanvasApplication.git

    相关文章

      网友评论

          本文标题:Android--垃圾桶控件

          本文链接:https://www.haomeiwen.com/subject/lpzszctx.html