Android BitmapShader setLocalMatrix缩放Bitmap高度重新onMeasure,Kotlin

Android BitmapShader setLocalMatrix缩放Bitmap高度重新onMeasure,Kotlin

XML 复制代码
<?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"/>

</LinearLayout>
Kotlin 复制代码
import android.content.Context
import android.graphics.Bitmap
import android.graphics.BitmapFactory
import android.graphics.BitmapShader
import android.graphics.Canvas
import android.graphics.Color
import android.graphics.Matrix
import android.graphics.Shader
import android.graphics.drawable.PaintDrawable
import android.os.Bundle
import android.util.AttributeSet
import androidx.appcompat.app.AppCompatActivity
import androidx.appcompat.widget.AppCompatImageView


class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
    }
}

class MyImageView : AppCompatImageView {
    private var mBitmapShader: BitmapShader? = null
    private var mDrawable: PaintDrawable? = null
    private val mx = Matrix()
    private val mFactor = 3.5f //对于原始图的放大系数。
    private var mBmp: Bitmap? = null

    constructor(ctx: Context, attrs: AttributeSet) : super(ctx, attrs) {
        mBmp = BitmapFactory.decodeResource(resources, R.mipmap.mypic)
        mBitmapShader = BitmapShader(
            mBmp!!,
            Shader.TileMode.DECAL,
            Shader.TileMode.DECAL
        )

        //对于原始图放大。
        mx.setScale(mFactor, mFactor)

        mDrawable = PaintDrawable(Color.BLACK)
        mDrawable!!.paint.shader = mBitmapShader
        mDrawable!!.paint.shader.setLocalMatrix(mx)
        mDrawable!!.setBounds(0, 0, mBmp!!.width * mFactor.toInt(), mBmp!!.height * mFactor.toInt())
    }

    //测量高度。
    override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec)

        val heightMode = MeasureSpec.getMode(heightMeasureSpec)
        val heightSize = MeasureSpec.getSize(heightMeasureSpec)

        var myHeight = 0
        myHeight = if (heightMode == MeasureSpec.EXACTLY) { //在xml精确设置值或者为match_parent
            heightSize
        } else {
            //如果是wrap_content,则需要重新设置高度,否则onDraw不会"draw"显示。
            mBmp!!.height * mFactor.toInt()
        }

        this.setMeasuredDimension(widthMeasureSpec, myHeight)
    }

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

        mDrawable!!.draw(canvas)
    }
}

Android Matrix绘制PaintDrawable设置BitmapShader,手指触点为圆心scale放大原图,Kotlin(二)-CSDN博客文章浏览阅读676次,点赞11次,收藏6次。遗留问题,手指在上图滑动过程中,当滑动到一定区域,下面的切图框中已无太有效的图可以"放大",后续可以填充黑色,表示无效放大。所有的绘制轨迹线,都限定在了绿色的圆角矩形框中,超出区域不予绘制。基础上,限定下面切图的绘制区域,超出绿色区域的轨迹线不再绘制。https://blog.csdn.net/zhangphil/article/details/135601993

Android自定义ViewGroup:onMeasure与onLayout(1)_android viewgroup onmeasure onlayout-CSDN博客文章浏览阅读2.9k次。Android自定义ViewGroup:onMeasure与onLayout(1)Android自定义一个ViewGroup,需要重写ViewGrouo里面的两个最重要的回调函数onMeasure()与onLayout()。如果开发者自己摆脱Android为我们做好的几套布局(如常见的线1性布局、相对布局、帧布局等等),往底层实现view呈现,那么我们就得在ViewGroup中小心计算_android viewgroup onmeasure onlayouthttps://blog.csdn.net/zhangphil/article/details/51191567 Android横竖屏切换View设置不同尺寸或等比例缩放的自定义View的onMeasure解决方案(2)_安卓自定义view,竖屏切到横屏时宽度不变化-CSDN博客文章浏览阅读3.9k次。Android横竖屏切换View设置不同尺寸或等比例缩放的自定义View的onMeasure解决方案(2)附录文章1以xml布局文件方式实现了一个view在横竖屏切换时候的大小尺寸缩放,实现这种需求,也可以使用自定义View的onMeasure方法实现。比如,写一个自定义的ScaleRelativeLayout相对布局:https://blog.csdn.net/zhangphil/article/details/73467857

相关推荐
介一安全1 小时前
【Frida Android】基础篇15(完):Frida-Trace 基础应用——JNI 函数 Hook
android·网络安全·ida·逆向·frida
吞掉星星的鲸鱼1 小时前
android studio创建使用开发打包教程
android·ide·android studio
陈老师还在写代码1 小时前
android studio 签名打包教程
android·ide·android studio
csj501 小时前
android studio设置
android
hifhf1 小时前
Android Studio gradle下载失败报错
android·ide·android studio
陈老师还在写代码1 小时前
android studio,java 语言。新建了项目,在哪儿设置 app 的名字和 logo。
android·java·android studio
消失的旧时光-19431 小时前
Kotlin reified泛型 和 Java 泛型 区别
java·kotlin·数据
2501_916007473 小时前
Fastlane 结合 开心上架(Appuploader)命令行实现跨平台上传发布 iOS App 的完整方案
android·ios·小程序·https·uni-app·iphone·webview
listhi5205 小时前
Vue.js 3的组合式API
android·vue.js·flutter
用户69371750013845 小时前
🚀 Jetpack MVI 实战全解析:一次彻底搞懂 MVI 架构,让状态管理像点奶茶一样丝滑!
android·android jetpack