首页 > 其他分享 >安卓-PorterDuffXfermode

安卓-PorterDuffXfermode

时间:2022-12-31 16:45:37浏览次数:36  
标签:mPath 安卓 private event mPaint PorterDuffXfermode dst

一、当我们要实现两张图片之间的混合模式的时候经常会用到PorterDuffXfermode

二、使用方法

mPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_IN));

在mPaint调用setXfermode之前的对mPaint的draw称之为src,在setXfermode之后对mPaint的draw称之为dst

 

如上的代码设置的是DST_IN的模式,即使用dst的区域显示src的内容,还有其他模式可以看如下的显示,正方形是src,圆形是dst

三、刮刮乐的例子

刮刮乐手动涂抹的区域会显示出对应的背景内容,代码如下所示

    private Bitmap mBGBitmap;
    private Bitmap mFGBitmap;
    private Canvas mCanvas;
    private Paint mPaint;
    private Path mPath;
    private void init() {
        mBGBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.test1);
        mFGBitmap = Bitmap.createBitmap(mBGBitmap.getWidth(), mBGBitmap.getHeight(), Bitmap.Config.ARGB_8888);
        mCanvas = new Canvas(mFGBitmap);
        mCanvas.drawColor(Color.GRAY); // 设置整体的画布颜色为灰色

        mPaint = new Paint();
        mPaint.setAlpha(0); // 将src设置为透明的
        mPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_IN)); // DST_IN获取的是dst的绘制区域,src的绘制内容
        // 设置dst画实线的参数
        mPaint.setStyle(Paint.Style.STROKE);
        mPaint.setStrokeWidth(50);
        mPaint.setStrokeJoin(Paint.Join.ROUND);
        mPaint.setStrokeCap(Paint.Cap.ROUND);

        mPath = new Path();
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        switch (event.getAction()) {
            case ACTION_DOWN:
                mPath.reset();
                mPath.moveTo(event.getX(), event.getY());
                break;
            case ACTION_MOVE:
                mPath.lineTo(event.getX(), event.getY());
                break;
        }
        mCanvas.drawPath(mPath, mPaint); // 根据path和paint在画布上面绘制dst线,最终会绘制到mFGBitmap;
        invalidate();
        return true;
    }

    @Override
    protected void onDraw(Canvas canvas) {
        canvas.drawBitmap(mBGBitmap, 0, 0, null);
        canvas.drawBitmap(mFGBitmap, 0, 0, null);
    }
View Code

 

安卓群英传里面的一个提示:在使用PorterDuffXfermode时还有一点需要注意,那就是最好在绘图时,将硬件加速关闭,因为有些模式并不支持硬件加速

 

标签:mPath,安卓,private,event,mPaint,PorterDuffXfermode,dst
From: https://www.cnblogs.com/czwlinux/p/17016903.html

相关文章

  • R语言对git安卓包分类统计、聚类、复杂网络可视化分析
    我们曾经为一位客户进行了短暂的咨询工作,他正在构建一个主要基于安卓包分类的分析应用程序。数据源是安卓的项目,把同一类功能的安卓代码的头部,每一个文件都有import 包名......
  • 适合编程初学者的开源项目:小游戏2048(安卓版)
    目标为编程初学者打造入门学习项目,使用各种主流编程语言来实现。安卓版效果图技术特点安卓Kotlin工程截图开源地址https://gitee.com/lblbc/game_2048关于厦门......
  • win11 运行安卓程序 详细步骤
    Android子系统的要求确保Windows11版本为22000.xxx或更高版本。硬件必须支持并启用BIOS/UEFI虚拟化确保微软商店版本为22110.1402.6.0或更高版本,并单击“获取更新”按......
  • 安卓期末大作业——汉服社区(源码+任务书)
    课题的作用和意义汉族占中国人口的91%,是中国的主体民族,在越来越全球化的今天,我们正越来越多地,在不同场合,与不同的民族打交道,由此也就越是需要民族身份的认同和辨异。而由于......
  • 安卓期末大作业——校园二手街APP设计和实现
    目录1.引言41.1研究背景和意义41.2本文研究内容41.3论文结构安排42.相关文献综述52.1关于移动互联网的地理社交研究52.2关于移动互联网商业模式研究52.3关于......
  • 安卓期末大作业——小吃商城
        核心技术要点:通过Jetpack的导航组件——Navigation,实现了1个activity嵌套多个fragment的底部导航菜单,Navigation的依赖如下所示:dependencies{  defnav_version......
  • 安卓期末大作业——鲜花商店APP(源码+任务书)
    课程考核报告姓 名:学 号:完 成日期2022年5月建议从以下方面填写:1.课题的作用和意义 2.课题综述 3.完成思路与方法 4.软件设计流程图(图示说明系统)5.课程设计的收......
  • 安卓期末大作业——养猫论坛(源码+任务书)
    随着我国孤独人口和丁克群体的增长,人们迫切需要一个事务来宣泄自己的感情,宠物就是一个最好的选择。对于普通民众,宠物的花销相对较低,大部分人都足以供给,且随着我国人口老龄化......
  • 安卓期末大作业——图书信息管理系统
    前言随着信息技术的高速发展,科技逐渐走进各行各业,帮助人们快速、便利地完成一些工作。BMS系统是基于Android移动设备的应用软件,该系统能够帮助用户在家里通过手机查看相应图......
  • 安卓期末大作业——单词本APP(源码+任务书)
    项目报告2020-2021学年第2学期课程名称: Android移动开发技术项目名称:单词本学生姓名:小组成员:2021年6月题目:单词本APP1需求分析与系统设计项目介绍此项目是一个......