Android Matrix绘制PaintDrawable设置BitmapShader,手指触点为圆心scale放大原图,Kotlin(二)

这篇具有很好参考价值的文章主要介绍了Android Matrix绘制PaintDrawable设置BitmapShader,手指触点为圆心scale放大原图,Kotlin(二)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Android Matrix绘制PaintDrawable设置BitmapShader,手指触点为圆心scale放大原图,Kotlin(二)

 文章来源地址https://www.toymoban.com/news/detail-807769.html

在  Android Matrix绘制PaintDrawable设置BitmapShader,手指触点为圆心scale放大原图,Kotlin-CSDN博客 基础上,限定下面切图的绘制区域,超出绿色区域的轨迹线不再绘制。

 

import android.content.Context
import android.graphics.Bitmap
import android.graphics.BitmapShader
import android.graphics.Canvas
import android.graphics.Color
import android.graphics.Matrix
import android.graphics.Paint
import android.graphics.Path
import android.graphics.RectF
import android.graphics.Shader.TileMode
import android.graphics.drawable.BitmapDrawable
import android.graphics.drawable.PaintDrawable
import android.os.Bundle
import android.util.AttributeSet
import android.view.MotionEvent
import android.widget.ImageView
import androidx.appcompat.app.AppCompatActivity
import androidx.appcompat.widget.AppCompatImageView


class MainActivity : AppCompatActivity() {
    private var iv: MyImageView? = null

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        iv = findViewById(R.id.iv)

        val r = findViewById<ImageView>(R.id.result)
        iv?.setTestImageView(r)
    }
}

class MyImageView : AppCompatImageView {
    private var mCurX = 0f
    private var mCurY = 0f

    private val mPath1 = Path()
    private val mPath2 = Path()

    private val mPathPaint1 = Paint()
    private val mPathPaint2 = Paint()
    private val mPathPaint3 = Paint()
    private val mCirclePaint = Paint()

    private var mNewBmp: Bitmap? = null
    private var mSrcBmp: Bitmap? = null
    private var mIsDraw = false
    private val mRadius = 380f

    private var mDrawable: PaintDrawable? = null

    private var testIV: ImageView? = null

    //放大系数。
    private val mScaleFactor = 2.6f

    private var mBitmapShader: BitmapShader? = null

    constructor(ctx: Context, attrs: AttributeSet) : super(ctx, attrs) {
        mSrcBmp = (drawable as BitmapDrawable).bitmap //mSrcBmp是原始图大小,没有缩放和拉伸的。

        mPathPaint1.style = Paint.Style.STROKE
        mPathPaint1.strokeWidth = 10f
        mPathPaint1.isAntiAlias = true
        mPathPaint1.color = Color.RED

        mPathPaint2.style = Paint.Style.STROKE
        mPathPaint2.strokeWidth = 25f
        mPathPaint2.isAntiAlias = true
        mPathPaint2.color = Color.YELLOW

        mPathPaint3.style = Paint.Style.STROKE
        mPathPaint3.strokeWidth = 3f
        mPathPaint3.isAntiAlias = true
        mPathPaint3.color = Color.GREEN

        mCirclePaint.style = Paint.Style.STROKE
        mCirclePaint.strokeWidth = 30f
        mCirclePaint.isAntiAlias = true
        mCirclePaint.color = Color.BLUE
    }

    fun setTestImageView(iv: ImageView?) {
        testIV = iv
    }

    override fun onTouchEvent(event: MotionEvent): Boolean {
        mCurX = event.x
        mCurY = event.y

        when (event.action) {
            MotionEvent.ACTION_DOWN -> {
                mPath1.moveTo(mCurX, mCurY)
                mPath2.moveTo(mCurX * mScaleFactor, mCurY * mScaleFactor)

                mIsDraw = true
            }

            MotionEvent.ACTION_MOVE -> {
                mPath1.lineTo(mCurX, mCurY)
                mPath2.lineTo(mCurX * mScaleFactor, mCurY * mScaleFactor)
            }

            MotionEvent.ACTION_UP, MotionEvent.ACTION_CANCEL -> {
                mIsDraw = false

                //抬手后,清除手指轨迹。
                myClear()
            }
        }

        invalidate()

        return true
    }

    private fun myClear() {
        //清除历史轨迹。
        mPath1.reset()
        mPath2.reset()
    }

    override fun onDraw(canvas: Canvas) {
        super.onDraw(canvas)

        if (mIsDraw) {
            myDraw()

            canvas.drawPath(mPath1, mPathPaint1)
        }
    }

    private fun myDraw() {
        if (mBitmapShader == null) {
            //创建一次,避免重复创建,提高速度。
            mBitmapShader = BitmapShader(
                Bitmap.createScaledBitmap(
                    mSrcBmp!!,
                    (this.width * mScaleFactor).toInt(), //注意这里的如果精度损失,会造成坐标偏移
                    (this.height * mScaleFactor).toInt(),//注意这里的如果精度损失,会造成坐标偏移
                    true
                ),
                TileMode.DECAL,
                TileMode.DECAL
            )
        }

        if (mDrawable == null) {
            //创建一次,避免重复创建,提高速度。
            mDrawable = PaintDrawable(Color.BLACK)
            mDrawable!!.setCornerRadius(mRadius / 2) //圆角矩形,如果不除2即是圆形框图。
            mDrawable!!.paint.shader = mBitmapShader
            mDrawable!!.setBounds(0, 0, (mRadius * 2).toInt(), (mRadius * 2).toInt())
        }

        if (mNewBmp == null) {
            //创建一次,避免重复创建,提高速度。
            mNewBmp = Bitmap.createBitmap(this.width, this.height, Bitmap.Config.ARGB_8888)
        }

        val c = Canvas(mNewBmp!!)
        c.drawColor(Color.GRAY) //底色。

        val matrix = Matrix()
        matrix.setScale(mScaleFactor, mScaleFactor)
        matrix.setTranslate((-mCurX) * mScaleFactor + mRadius, (-mCurY) * mScaleFactor + mRadius)

        mDrawable!!.paint.shader.setLocalMatrix(matrix)
        mDrawable!!.draw(c)


        val rectF = RectF()
        matrix.mapRect(rectF)

        val cx = mCurX * mScaleFactor + rectF.left
        val cy = mCurY * mScaleFactor + rectF.top
        //蓝色中心圆圈
        c.drawCircle(cx, cy, 50f, mCirclePaint)


        //绿色圆角矩形框。
        val roundRectPath = Path()
        val roundRectF = RectF(cx - 250, cy - 250, cy + 250, cy + 250)
        roundRectPath.addRoundRect(roundRectF, 25f, 25f, Path.Direction.CW)
        c.drawPath(roundRectPath, mPathPaint3)

        //限定下面切图中Path绘制轨迹路线的区域,超出边界不绘制。
        c.clipRect(roundRectF)

        //下面小框图里面的Path
        val path = Path()
        mPath2.transform(matrix, path)
        //绘制下面框图里面的Path
        c.drawPath(path, mPathPaint2)


        testIV?.setImageBitmap(mNewBmp)
    }
}

 

 

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@android:color/darker_gray"
    android:orientation="vertical"
    tools:context=".MainActivity">

    <com.pkg.MyImageView
        android:id="@+id/iv"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:adjustViewBounds="true"
        android:background="@drawable/ic_launcher_background"
        android:scaleType="fitCenter"
        android:src="@mipmap/mypic" />

    <ImageView
        android:id="@+id/result"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="40dp"
        android:background="@drawable/ic_launcher_background"
        android:src="@drawable/ic_launcher_foreground" />

</LinearLayout>

 

 

Android Matrix绘制PaintDrawable设置BitmapShader,手指触点为圆心scale放大原图,Kotlin(二),Android ,kotlin,android,kotlin

 

 

Android Matrix绘制PaintDrawable设置BitmapShader,手指触点为圆心scale放大原图,Kotlin(二),Android ,kotlin,android,kotlin

所有的绘制轨迹线,都限定在了绿色的圆角矩形框中,超出区域不予绘制。

 

 

Android Matrix绘制PaintDrawable设置BitmapShader,手指触点为圆心scale放大原图,Kotlin(二),Android ,kotlin,android,kotlin

 

遗留问题,手指在上图滑动过程中,当滑动到一定区域,下面的切图框中已无太有效的图可以“放大”,后续可以填充黑色,表示无效放大。

 

Android Matrix绘制PaintDrawable设置BitmapShader,手指触点为圆心scale放大原图,Kotlin-CSDN博客文章浏览阅读339次,点赞9次,收藏11次。的基础上,实现一个功能,手指在上面原图的区域滑动,然后在下面的图中以若干放大因子放大显示切块出来的小图,下面切块出来的原图的圆心是手指在上面的触点。同时在下图中复刻上图手指滑动的轨迹。下图的中心圆点用一个圆圈,标识出手指在上图的触点。下图相当于一个放大镜,同时在放大镜图里面显示手指划过的轨迹。遗留一个问题,更好的做法是在下图中只显示圆角矩形切图区域里面的路径,超出圆角矩形切图外的区域,不应该再显示路径。https://blog.csdn.net/zhangphil/article/details/135596459

 

到了这里,关于Android Matrix绘制PaintDrawable设置BitmapShader,手指触点为圆心scale放大原图,Kotlin(二)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Android画布Canvas drawPath绘制跟随手指移动的圆,Kotlin

                      Android SurfaceView简例-CSDN博客 文章浏览阅读2.3k次。Android SurfaceView简例Android中各的SurfaceView和View有很大的不同,两者应用场景不同。大多数View能做的事情SurfaceView也可以,但是SurfaceView效率更高。Android的View绘制过程由Android系统控制,刷新机制开发者比较难

    2024年02月03日
    浏览(44)
  • 使用Python绘制混淆矩阵Confusion Matrix、自定义样式

    使用Python绘制混淆矩阵,原创,直接使用即可,样式可以自由变换。 混淆矩阵也称误差矩阵,是表示精度评价的一种标准格式,用n行n列的矩阵形式来表示。具体评价指标有总体精度、制图精度、用户精度等,这些精度指标从不同的侧面反映了图像分类的精度。 直接上原创代

    2024年02月11日
    浏览(47)
  • 图像分类模型评估之用python绘制混淆矩阵confusion_matrix

    目录 训练完成后,生成混淆矩阵!!!! ImageNet数据格式,生成混淆矩阵!!!! 非 ImageNet数据格式,定义导入数据的类名和方法!!!! 非imageNet数据格式,完成生成混淆矩阵程序代码!!!! 混淆矩阵:是用于评估分类模型性能的一种常用工具,可以用于计算分类准确

    2024年02月01日
    浏览(54)
  • Android中Matrix的简单使用

    Matrix 是一款微信研发并日常使用的应用性能接入框架,支持iOS, macOS和Android。 Matrix 通过接入各种性能监控方案,对性能监控项的异常数据进行采集和分析,输出相应的问题分析、定位与优化建议,从而帮助开发者开发出更高质量的应用。 ​ Matrix-android 当前监控范围包括:应

    2024年02月05日
    浏览(44)
  • Android Matrix (三)矩阵组合和应用变换

    在 Android 开发中, Matrix 类不仅提供了 mapPoints 方法来变换点坐标,还提供了多种其他用法,使其成为处理图像和视图变换的强大工具。以下是 Matrix 类的一些关键用法: 1. 变换方法 setTranslate(float dx, float dy) : 设置矩阵为平移矩阵。 setScale(float sx, float sy, float px, float py) : 设置

    2024年02月02日
    浏览(37)
  • Android挖取原图手指触点区域RectF(并框线标记)放大到ImageView宽高与矩阵mapRadius,Kotlin

    这里 Android挖取原图中心区域RectF(并框线标记)放大到ImageView宽高,Kotlin-CSDN博客 实现的是把原图中心区域的一片小图挖取出来放大放到下面的ImageView里面,现在不再固定中心位置,而是以手指在上图的触点位置为中心位置,挖取一片区域图放大,然后放到下面的ImageView里面

    2024年03月13日
    浏览(87)
  • Android Matrix (二)具体图形变换参数的获取

    Matrix 类在 Android 中用于表示 3x3 的变换矩阵。这个矩阵可以应用于画布(Canvas),视图(View)或者位图(Bitmap),以实现各种图形变换,如旋转、缩放、平移和倾斜。 在 Android 中, Matrix 类并不直接提供方法来查询它所执行的特定变换(如平移、缩放、旋转等)。然而,您可

    2024年01月22日
    浏览(46)
  • Android中矩阵Matrix实现平移,旋转,缩放和翻转的用法详细介绍

    一,矩阵Matrix的数学原理 矩阵的数学原理涉及到矩阵的运算和变换,是高等代数学中的重要概念。在图形变换中,矩阵起到关键作用,通过矩阵的变换可以改变图形的位置、形状和大小。矩阵的运算是数值分析领域的重要问题,对矩阵进行分解和简化可以简化计算过程。对于

    2024年01月22日
    浏览(54)
  • Android性能优化系列-腾讯matrix-IO监控-IOCanaryPlugin源码分析

    作者:秋去无痕 matrix 对io的监控包括四个方面 监控在主线程执行 IO 操作的问题 监控缓冲区过小的问题 监控重复读同一文件 监控内存泄漏问题 IOCanaryPlugin,内部由IOCanaryCore完成真正的操作。 根据配置进行hook的安装 取消hook 底层hook安装包函几个步骤,加载so,设置hook内容,

    2024年02月09日
    浏览(83)
  • Android画布Canvas矩阵Matrix放大裁剪Rect区域的Bitmap,Kotlin

                          Android Matrix画布Canvas缩放scale,Kotlin-CSDN博客 文章浏览阅读116次,点赞3次,收藏3次。文章浏览阅读9.6k次。文章浏览阅读1.8k次。/*Java代码 将Drawable转化为Bitmap */ Bitmap drawableToBitmap(Drawable drawable) { int width = drawable.getIntrinsicWidth();Android Material Design :Line

    2024年02月03日
    浏览(41)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包