IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> 自定义类似刮刮乐View动态配置刮出图片 -> 正文阅读

[移动开发]自定义类似刮刮乐View动态配置刮出图片

其实很简单就是ImageView先画蒙版,蒙版需要是本地的图片,这里画图片需要本地图的地址或者流
如果需要加载线上的图片,建议图片缓存流然后加载(当然只是纸上谈兵,有心的小伙伴可以试试)
这里在抬手的时候就进行加载网络图片了


public class MyCardView extends AppCompatImageView {
    private Paint mForePaint;
    private Bitmap mBitmap;//加载资源文件
    private Canvas mForeCanvas;//前景图Canvas
    private Bitmap mForeBitmap;//前景图Bitmap
    private boolean isClear = false;
    private Path mPath = new Path();
    private String overPath = "",backPath = "";
    public MyCardView(Context context) {
        super(context);
    }

    public MyCardView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public MyCardView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);

    }

    public void setImages(int width,int height,InputStream inputStream, String backPath){
        this.overPath = overPath;
        this.backPath = backPath;
        mBitmap = BitmapFactory.decodeStream(inputStream);
        mForePaint = new Paint();
        mForePaint.setAntiAlias(true);
        mForePaint.setAlpha(0);
        mForePaint.setStrokeCap(Paint.Cap.ROUND);
        mForePaint.setStrokeJoin(Paint.Join.ROUND);
        mForePaint.setStyle(Paint.Style.STROKE);
        mForePaint.setStrokeWidth(50);
        mForePaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_IN));

        mForeBitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
        mForeCanvas = new Canvas(mForeBitmap);
        mForeCanvas.drawBitmap(mBitmap, 0, 0, null);
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        if (!isClear) {
            canvas.drawBitmap(mForeBitmap, 0, 0, null);
        }else {
            Glide.with(getContext()).load(backPath).into(this);
        }
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        switch (event.getAction()){
            case MotionEvent.ACTION_DOWN:
                mPath.moveTo(event.getX(), event.getY());
                break;
            case MotionEvent.ACTION_MOVE:
                mPath.lineTo(event.getX(),event.getY());
                break;
            case MotionEvent.ACTION_UP:
                isClear = true;
                postInvalidate();
                break;
        }
        mForeCanvas.drawPath(mPath, mForePaint);
        invalidate();
        return true;
    }

}

这里是GitHub - Lichenwei-Dev/ScratchCardView: Android开发之自定义刮刮卡实现

这个大神实现的效果,是判断所挂面积判断是否显示

/**
 * 开启子线程计算被擦除的像素点
 */
private Runnable mRunnable = new Runnable() {
    int[] pixels;

    @Override
    public void run() {

        int w = mForeBitmap.getWidth();
        int h = mForeBitmap.getHeight();

        float wipeArea = 0;
        float totalArea = w * h;


        pixels = new int[w * h];
        /**
         * pixels      接收位图颜色值的数组
         * offset      写入到pixels[]中的第一个像素索引值
         * stride      pixels[]中的行间距个数值(必须大于等于位图宽度)。可以为负数
         * x           从位图中读取的第一个像素的x坐标值。
         * y           从位图中读取的第一个像素的y坐标值
         * width      从每一行中读取的像素宽度
         * height    读取的行数
         */
        mForeBitmap.getPixels(pixels, 0, w, 0, 0, w, h);

        for (int i = 0; i < w; i++) {
            for (int j = 0; j < h; j++) {
                int index = i + j * w;
                if (pixels[index] == 0) {
                    wipeArea++;
                }
            }
        }


        if (wipeArea > 0 && totalArea > 0) {
            int percent = (int) (wipeArea * 100 / totalArea);
            if (percent > 50) {
                isClear = true;
                postInvalidate();
            }
        }

    }
};
  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2022-05-15 11:39:14  更:2022-05-15 11:40:03 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/25 1:22:58-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码