Android BitmapShader简洁实现马赛克,Kotlin(二)

Android BitmapShader简洁实现马赛克,Kotlin(二)

 

这一篇

Android BitmapShader简洁实现马赛克,Kotlin(一)-CSDN博客

遗留一个问题,xml定义的MyView为wrap_content的宽高,如果改成其他模式如match_parent,因为background的Bitmap和draw时候的Bitmap不一致(background被拉伸了),导致手指划过屏幕涂抹的马赛克和实际的对不上,现在改进:

 

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="wrap_content"tools:context=".MainActivity"><com.myapp.MyViewandroid:layout_width="match_parent"android:layout_height="wrap_content" /></RelativeLayout>

 

 

 

import android.content.Context
import android.graphics.Bitmap
import android.graphics.BitmapFactory
import android.graphics.BitmapShader
import android.graphics.Canvas
import android.graphics.Matrix
import android.graphics.Paint
import android.graphics.Path
import android.graphics.RectF
import android.graphics.Shader
import android.graphics.drawable.BitmapDrawable
import android.util.AttributeSet
import android.view.MotionEvent
import androidx.appcompat.widget.AppCompatImageView
import androidx.core.graphics.toRectclass MyView : AppCompatImageView {private var mPaint: Paint = Paint()private var mPath: Path = Path()private var mPreX = 0fprivate var mPreY = 0fprivate var mBitmapShader: BitmapShader? = nullprivate val mResId = R.mipmap.nplprivate var mMosaicScaleFactor = 32f //值越大,马赛克效果越强。private var mSrcBmp: Bitmap? = nullprivate var mSrcBmpW = 0private var mSrcBmpH = 0private var mScaleImageW = 0private var mScaleImageH = 0constructor(ctx: Context, attributeSet: AttributeSet) : super(ctx, attributeSet) {mPaint.style = Paint.Style.STROKEmPaint.strokeWidth = 100fmSrcBmp = BitmapFactory.decodeResource(resources, mResId, null)mSrcBmpW = mSrcBmp!!.widthmSrcBmpH = mSrcBmp!!.heightmScaleImageW = getScaleImageWidth()mScaleImageH = getScaleImageHeight()background = getBGBitmapDrawable()val mosaicBmp = getMosaicBmp(mSrcBmp!!)mBitmapShader = BitmapShader(mosaicBmp, Shader.TileMode.CLAMP, Shader.TileMode.REPEAT)mPaint.setShader(mBitmapShader)}override fun onDraw(canvas: Canvas) {super.onDraw(canvas)canvas.drawPath(mPath, mPaint)}override fun onTouchEvent(event: MotionEvent): Boolean {when (event.action) {MotionEvent.ACTION_DOWN -> {mPath.moveTo(event.x, event.y)mPreX = event.xmPreY = event.yreturn true}MotionEvent.ACTION_MOVE -> {val endX = (mPreX + event.x) / 2val endY = (mPreY + event.y) / 2mPath.quadTo(mPreX, mPreY, endX, endY)mPreX = event.xmPreY = event.y}MotionEvent.ACTION_UP -> {}}postInvalidate()return super.onTouchEvent(event)}private fun getSmallBmp(srcBmp: Bitmap): Bitmap {//空Bitmapval dstBmp =Bitmap.createBitmap((mSrcBmpW / mMosaicScaleFactor).toInt(), (mSrcBmpH / mMosaicScaleFactor).toInt(), Bitmap.Config.ARGB_8888)val c = Canvas(dstBmp)val mtx = Matrix()mtx.setScale(1 / mMosaicScaleFactor, 1 / mMosaicScaleFactor)c.drawBitmap(srcBmp, mtx, null)return dstBmp}private fun getMosaicBmp(srcBmp: Bitmap): Bitmap {val smallBmp = getSmallBmp(srcBmp)//空Bitmapval dstBmp = Bitmap.createBitmap(mScaleImageW, mScaleImageH, Bitmap.Config.ARGB_8888)val srcRectF = RectF(0f, 0f, smallBmp.width.toFloat(), smallBmp.height.toFloat())val dstRectF = RectF(0f, 0f, mScaleImageW.toFloat(), mScaleImageH.toFloat())val c = Canvas(dstBmp)c.drawBitmap(smallBmp, srcRectF.toRect(), dstRectF.toRect(), null)return dstBmp}private fun getBGBitmapDrawable(): BitmapDrawable {val bd = BitmapDrawable(resources, Bitmap.createScaledBitmap(mSrcBmp!!, mScaleImageW, mScaleImageH, true))return bd}private fun getScaleImageWidth(): Int {return resources.displayMetrics.widthPixels}private fun getScaleImageHeight(): Int {return (resources.displayMetrics.heightPixels * (mSrcBmpW / resources.displayMetrics.widthPixels.toFloat())).toInt()}
}

 

 

 

 

 

 

 

 

 

 

 

Android BitmapShader简洁实现马赛克,Kotlin(一)-CSDN博客文章浏览阅读465次,点赞7次,收藏5次。Android拼接合并图片生成长图代码实现合并两张图片,以第一张图片的宽度为标准,如果被合并的第二张图片宽度和第一张不同,那么就以第一张图片的宽度为准线,对第二张图片进行缩放。Android拼接合并图片生成长图代码实现合并两张图片,以第一张图片的宽度为标准,如果被合并的第二张图片宽度和第一张不同,那么就以第一张图片的宽度为准线,对第二张图片进行缩放。https://blog.csdn.net/zhangphil/article/details/145308087https://blog.csdn.net/zhangphil/article/details/145308087

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/68041.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

智能化加速标准和协议的更新并推动验证IP(VIP)在芯片设计中的更广泛应用

作者&#xff1a;Karthik Gopal, SmartDV Technologies亚洲区总经理 智权半导体科技&#xff08;厦门&#xff09;有限公司总经理 随着AI技术向边缘和端侧设备广泛渗透&#xff0c;芯片设计师不仅需要考虑在其设计中引入加速器&#xff0c;也在考虑采用速度更快和带宽更高的总…

【问题】Chrome安装不受支持的扩展 解决方案

此扩展程序已停用&#xff0c;因为它已不再受支持 Chromium 建议您移除它。详细了解受支持的扩展程序 此扩展程序已停用&#xff0c;因为它已不再受支持 详情移除 解决 1. 解压扩展 2.打开manifest.json 3.修改版本 将 manifest_version 改为3及以上 {"manifest_ver…

Vue入门(Vue基本语法、axios、组件、事件分发)

Vue入门 Vue概述 Vue (读音/vju/&#xff0c;类似于view)是一套用于构建用户界面的渐进式框架&#xff0c;发布于2014年2月。与其它大型框架不同的是&#xff0c;Vue被设计为可以自底向上逐层应用。Vue的核心库只关注视图层&#xff0c;不仅易于上手&#xff0c;还便于与第三…

[云讷科技]Kerloud Falcon四旋翼飞车虚拟仿真空间发布

虚拟仿真环境作为一个独立的专有软件包提供给我们的客户&#xff0c;用于帮助用户在实际测试之前验证自身的代码&#xff0c;并通过在仿真引擎中添加新的场景来探索新的飞行驾驶功能。 环境要求 由于环境依赖关系&#xff0c;虚拟仿真只能运行在装有Ubuntu 18.04的Intel-64位…

postgresql15的启动

PostgreSQL是一个功能非常强大的、源代码开放的客户/服务器关系型数据库管理系统&#xff0c;且因为许可证的灵活&#xff0c;任何人都可以以任何目的免费使用、修改和分发PostgreSQL。现在国产数据库大力发展阶段&#xff0c;学习和熟悉postgresql的功能是非常有必要的&#x…

Python NumPy(1):介绍、Ndarray对象、NumPy数据类型

1 介绍 NumPy(Numerical Python) 是 Python 语言的一个扩展程序库&#xff0c;支持大量的维度数组与矩阵运算&#xff0c;此外也针对数组运算提供大量的数学函数库。NumPy 是一个运行速度非常快的数学库&#xff0c;主要用于数组计算&#xff0c;包含&#xff1a; 一个强大的N…

sql语句--新手入门增删改查保姆级教学

一丶在数据库管理系统中&#xff0c;SQL&#xff08;Structured Query Language&#xff0c;结构化查询语言&#xff09;是用于访问和操作数据库的标准编程语言。以下将通过一个假设的“articles”表&#xff08;代表文章或博客条目&#xff09;来展示SQL中的增&#xff08;Ins…

INCOSE需求编写指南-第1部分:介绍

第1部分&#xff1a;介绍Section 1: Introduction 1.1 目的和范围 Purpose and Scope 本指南专门介绍如何在系统工程背景下以文本形式表达需求和要求陈述。其目的是将现有标准&#xff08;如 ISO/IEC/IEEE 29148&#xff09;中的建议以及作者、主要贡献者和审稿员的最佳实践结…

Windows上通过Git Bash激活Anaconda

在Windows上配置完Anaconda后&#xff0c;普遍通过Anaconda Prompt激活虚拟环境并执行Python&#xff0c;如下图所示&#xff1a; 有时需要连续执行多个python脚本时&#xff0c;直接在Anaconda Prompt下可以通过在以下方式&#xff0c;即命令间通过&&连接&#xff0c;…

GIS 中的 SQLAlchemy:空间数据与数据库之间的桥梁

利用 SQLAlchemy 在现代应用程序中无缝集成地理空间数据导言 地理信息系统&#xff08;GIS&#xff09;在管理城市规划、环境监测和导航系统等各种应用的空间数据方面发挥着至关重要的作用。虽然 PostGIS 或 SpatiaLite 等专业地理空间数据库在处理空间数据方面非常出色&#…

MySQL中的读锁与写锁:概念与作用深度剖析

MySQL中的读锁与写锁&#xff1a;概念与作用深度剖析 在MySQL数据库的并发控制机制中&#xff0c;读锁和写锁起着至关重要的作用。它们是确保数据在多用户环境下能够正确、安全地被访问和修改的关键工具。 一、读锁&#xff08;共享锁&#xff09;概念 读锁&#xff0c;也称为…

SpringBoot 实现动态管理定时任务 Job的动态操作(添加、修改、启停、执行、删除)以及界面展示和具体Job的创建与执行示例

SpringBoot 实现动态管理定时任务 Job的动态操作&#xff08;添加、修改、启停、执行、删除&#xff09;以及界面展示和具体Job的创建与执行示例 关键接口类&#xff1a; CronTaskRegistrar SchedulingRunnable . 添加定时任务注册类&#xff0c;用来增加、删除定时任务 impo…

LabVIEW太赫兹二维扫描成像系统

使用LabVIEW设计太赫兹二维扫描成像系统。通过LabVIEW平台开发&#xff0c;结合硬件如太赫兹源、平移台、锁相放大器等&#xff0c;实现了高效、精准的成像功能。系统采用蛇形扫描方式&#xff0c;通过动态调整扫描参数&#xff0c;达到优化成像质量的目的。 ​ 项目背景 在非…

Spring 核心技术解析【纯干货版】- V:Spring 基础模块 Spring-Context 模块精讲

Spring 框架作为 Java 开发领域最流行的框架之一&#xff0c;其核心模块承载了大量企业级应用开发的基础功能。在 Spring 的核心模块中&#xff0c;Spring-Context 模块尤为重要&#xff0c;它不仅提供了应用上下文的管理功能&#xff0c;还扩展了事件驱动、国际化支持、资源加…

2025年国产化推进.NET跨平台应用框架推荐

2025年国产化推进.NET跨平台应用框架推荐 1. .NET MAUI NET MAUI是一个开源、免费&#xff08;MIT License&#xff09;的跨平台框架&#xff08;支持Android、iOS、macOS 和 Windows多平台运行&#xff09;&#xff0c;是 Xamarin.Forms 的进化版&#xff0c;从移动场景扩展到…

SQL注入漏洞之基础数据类型注入 字符 数字 搜索 XX 以及靶场实例哟

目录 基础数据类型SQL注入 字符类型注入 单引号双引号解释 案例练习: 数字类型注入 案例 搜索性注入: 案例 XX性注入: 语句 案例 基础SQL注入类型分类 基础数据类型SQL注入 字符类型注入 xxx or 11 # select id,email from member where usernamexx or 11 # --…

【ESP32】ESP32连接JY61P并通过WIFI发送给电脑

前言 手头上有个ESP32&#xff0c;发现有wifi功能&#xff0c;希望连接JY61P并通过WIFI把姿态数据发送给电脑 1.采用Arduino IDE编译器&#xff1b;需要安装ESP32的开发板管理器&#xff1b; 2.电脑接受数据是基于python的&#xff1b; 1. ESP32 连接手机WIFI #include <…

如何在data.table中处理缺失值

&#x1f4ca;&#x1f4bb;【R语言进阶】轻松搞定缺失值&#xff0c;让数据清洗更高效&#xff01; &#x1f44b; 大家好呀&#xff01;今天我要和大家分享一个超实用的R语言技巧——如何在data.table中处理缺失值&#xff0c;并且提供了一个自定义函数calculate_missing_va…

计算机视觉算法实战——无人机检测

✨个人主页欢迎您的访问 ✨期待您的三连 ✨ ✨个人主页欢迎您的访问 ✨期待您的三连 ✨ ✨个人主页欢迎您的访问 ✨期待您的三连✨ ​ ​ 1. 引言✨✨ 随着无人机技术的快速发展&#xff0c;无人机在农业、物流、监控等领域的应用越来越广泛。然而&#xff0c;无人机的滥用也带…

华为支付接入规范

为了确保用户获得良好的支付体验&#xff0c;Payment Kit制定了相关接入设计规范&#xff0c;请开发者遵照执行&#xff0c;具体要求&#xff08;非强制性&#xff09;如下&#xff1a; 一、支付方式呈现 涉及支付公司名称&#xff0c;请统一使用&#xff1a;花瓣支付&#xff…