美文网首页
单张图片逐步显示的动画

单张图片逐步显示的动画

作者: MacLi | 来源:发表于2022-05-18 14:09 被阅读0次

    单张图片逐步显示的动画,参考代码

    package com.desaysv.vehiclesetting.window.ui;
    
    import android.content.Context;
    import android.graphics.Bitmap;
    import android.graphics.BitmapFactory;
    import android.graphics.Canvas;
    import android.graphics.Color;
    import android.graphics.CornerPathEffect;
    import android.graphics.Matrix;
    import android.graphics.Paint;
    import android.graphics.Path;
    import android.graphics.PathEffect;
    import android.graphics.PixelFormat;
    import android.graphics.PorterDuff;
    import android.graphics.PorterDuffXfermode;
    import android.graphics.Rect;
    import android.graphics.drawable.Drawable;
    import android.util.AttributeSet;
    import android.util.Log;
    import android.view.View;
    
    import androidx.annotation.Nullable;
    
    import com.desaysv.vehiclesetting.R;
    
    /**
     * 充电进度视图
     */
    public class ProgressView extends View {
    
        private Paint mPaint;
    
        private int mWidth = 0;
        private int mHeight = 0;
    
        /**
         * 进度 Path
         */
        private final Path mProPath = new Path();
    
        /**
         * 当前进度
         */
        private int mProgress = 0;
    
        /**
         * 总进度
         */
        private final int maxProgress = 100;
    
        private Bitmap mSourceBitmap;
    
        private int mProWidth;
    
        private PorterDuffXfermode mXfermode = new PorterDuffXfermode(PorterDuff.Mode.SRC_IN);
    
        private Canvas mCanvas;
    
        private Rect mSrcRect;
        private Rect mDstRect;
    
        private Bitmap mFinalBitmap;
    
        public ProgressView(Context context) {
            super(context);
            init();
        }
    
        public ProgressView(Context context, @Nullable AttributeSet attrs) {
            super(context, attrs);
            init();
        }
    
        public void init() {
            mPaint = new Paint();
            mPaint.setAntiAlias(true);
            mPaint.setColor(Color.WHITE);
    
    //        PathEffect pathEffect = new CornerPathEffect(getResources().getDimensionPixelOffset(R.dimen.dp_5));
    //        mPaint.setPathEffect(pathEffect);
    
            mSourceBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.window_open_00000);
    //        mSourceBitmap = DrawableToBitmap(getBackground());
    //        Log.e("ProgressView", "mSourceBitmap.getWidth()=" + mSourceBitmap.getWidth() + ",mSourceBitmap.getHeight()=" + mSourceBitmap.getHeight());
    //        mSrcRect = new Rect(0, 0, mSourceBitmap.getWidth(), mSourceBitmap.getHeight());
    //        mDstRect = new Rect(0, 0, mWidth, mHeight);
        }
    
        @Override
        protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
            super.onMeasure(widthMeasureSpec, heightMeasureSpec);
            int width = MeasureSpec.getSize(widthMeasureSpec);
            int height = MeasureSpec.getSize(heightMeasureSpec);
    
            if (width != mWidth && height != mHeight) {
                mWidth = width;
                mHeight = height;
                mDstRect = new Rect(0, 0, mWidth, mHeight);
    //            Log.e("ProgressView", "mWidth=" + mWidth + ",mHeight=" + mHeight);
                mSourceBitmap = BitmapScale(mSourceBitmap, mWidth, mHeight);
    //            Log.e("ProgressView", "2.mSourceBitmap.getWidth()=" + mSourceBitmap.getWidth() + ",mSourceBitmap.getHeight()=" + mSourceBitmap.getHeight());
                mSrcRect = new Rect(0, 0, mSourceBitmap.getWidth(), mSourceBitmap.getHeight());
            }
        }
    
        @Override
        protected void onDraw(Canvas canvas) {
            super.onDraw(canvas);
            mSrcRect.top = mHeight - mProgress;
            mSrcRect.left = 0;
            mSrcRect.right = mSourceBitmap.getWidth();
            mSrcRect.bottom = mHeight;
    
            mDstRect.top = mHeight - mProgress;
            mDstRect.left = 0;
            mDstRect.right = mSourceBitmap.getWidth();
            mDstRect.bottom = mHeight;
    //        Log.e("ProgressView", "mSrcRect=" + mSrcRect.toString() + "," + mProgress);
    //        Log.e("ProgressView", "mDstRect=" + mDstRect.toString() + "," + mProgress);
            canvas.drawBitmap(mSourceBitmap, mSrcRect, mDstRect, mPaint);
        }
    
        /**
         * 设置进度
         */
        public void setProgress(int progress) {
    //        Log.e("ProgressView", "progress=" + progress);
            if (progress == mProgress) {
                return;
            }
            if (progress > mHeight) {
                setVisibility(View.INVISIBLE);
                return;
            }
            mProgress = progress;
            invalidate();
        }
    
    //    public void setResourceId(int resourceId) {
    //        mSourceBitmap = BitmapFactory.decodeResource(getResources(), resourceId);
    //    }
    
        public void startAnim() {
            setVisibility(View.VISIBLE);
            new Thread(new Runnable() {
                @Override
                public void run() {
                    int i = 0;
                    while (i++ <= mHeight) {
                        setProgress(i);
                        try {
                            Thread.sleep(20);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                }
            }).start();
        }
    
        // 5. Drawable----> Bitmap
        public static Bitmap DrawableToBitmap(Drawable drawable) {
            // 获取 drawable 长宽
            int width = drawable.getIntrinsicWidth();
            int heigh = drawable.getIntrinsicHeight();
            drawable.setBounds(0, 0, width, heigh);
            // 获取drawable的颜色格式
            Bitmap.Config config = drawable.getOpacity() != PixelFormat.OPAQUE ? Bitmap.Config.ARGB_8888
                    : Bitmap.Config.RGB_565;
            // 创建bitmap
            Bitmap bitmap = Bitmap.createBitmap(width, heigh, config);
            // 创建bitmap画布
            Canvas canvas = new Canvas(bitmap);
            // 将drawable 内容画到画布中
            drawable.draw(canvas);
            return bitmap;
        }
    
        public static Bitmap BitmapScale(Bitmap srcBitmap, int newWidth, int newHeight) {
            int width = srcBitmap.getWidth();
            int height = srcBitmap.getHeight();
            //计算压缩的比率
            float scaleWidth = ((float) newWidth) / width;
            float scaleHeight = ((float) newHeight) / height;
            Matrix matrix = new Matrix();
            matrix.postScale(scaleWidth, scaleHeight);
            return Bitmap.createBitmap(srcBitmap, 0, 0, width, height, matrix, true);
        }
    
    }
    
    

    相关文章

      网友评论

          本文标题:单张图片逐步显示的动画

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