Matrix 使用

Matrix 使用

val maxWidth = 100f
            val maxHeight = 100f

            val maxY = 13f
            val minY = 2f

            val matrix = Matrix()
            matrix.reset()
            //val tY = calculate(minY,maxY)
            //matrix.postTranslate(0f,-(maxY - minY))
//            matrix.postTranslate(0f,-(maxY - minY))
//            matrix.postTranslate(0f,-(minY))
            matrix.postTranslate(0f,-(maxY))

            val max = maxY - minY
            val sy = maxHeight/max
            Log.e("vic","sy = $sy  ${sy *(maxY - minY)}")
            //val sy = calculate(minY,maxY)
            val sx = maxWidth/4

            matrix.postScale(sx,-sy)
            val array = floatArrayOf(0f,maxY,1f,10f,2f,7f,3f,2f,4f,minY)
            printArray(array)
            matrix.mapPoints(array)
            printArray(array)
private fun printArray(array: FloatArray) {
        val list = ArrayList<Float>()
        list.addAll(array.toList())
        Log.e("vic","$list")
    }

矩阵的对坐标的相互转换

class DemoView @JvmOverloads constructor(context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0) : View(context, attrs, defStyleAttr) {


    val circlePaint:Paint by lazy {
         Paint().apply {
            color = Color.parseColor("#2E4A9D")
            strokeWidth = 5f
            style = Paint.Style.FILL
            isAntiAlias = true
        }
//        val circle2Paint = Paint()
//        circle2Paint.color = Color.parseColor("#2E4A9D")
//        circle2Paint.strokeWidth = px2dp(circleR1.toFloat()).toFloat()
//        circle2Paint.isAntiAlias = true
//        circle2Paint.style = Paint.Style.STROKE
//        circle2Paint
    }

    var circleR1 = 2
    var circleR2 = 4


    private val circle2Paint: Paint by lazy {
        val circle2Paint = Paint()
        circle2Paint.color = Color.parseColor("#2E4A9D")
        circle2Paint.strokeWidth = px2dp(circleR1.toFloat()).toFloat()
        circle2Paint.isAntiAlias = true
        circle2Paint.style = Paint.Style.STROKE
        circle2Paint
    }

    override fun onDrawForeground(canvas: Canvas?) {
        super.onDrawForeground(canvas)
    }

    override fun onDraw(canvas: Canvas) {

        canvas.drawColor(Color.RED)

        val maxWidth:Float = width.toFloat()//-300f
        val maxHeight:Float = height.toFloat()//-300f


        val maxY = 10f
        val minY = 0f



        val matrix = Matrix()

        val matrixX = Matrix()





//        matrix.postTranslate(0f,-(maxY))
//
//        val max = maxY - minY
//        val sy = maxHeight/max
//        val sx = maxWidth/4
//
//        matrix.postScale(sx,-sy)




        val sx = maxWidth/4

        val top = 120f

        canvas.drawLine(0f,top,width.toFloat(),top,circlePaint)


        val yMin = minY
        val yMax = maxY
        val bottom = maxHeight-150f

        canvas.drawLine(0f,bottom,width.toFloat(),bottom,circlePaint)


        // 先贴顶
        matrix.postTranslate(0f, top - yMin)
        val sy = (bottom - top) / (yMax - yMin)
        // 再缩放
        matrix.postScale(1f, sy, 0f, top)

        matrixX.postScale(sx,1f)



        val array = floatArrayOf(0f,maxY,1f,10f,2f,7f,3f,2f,4f,minY)
        printArray(array)
        val tempMatrix = Matrix()
        tempMatrix.postConcat(matrix)
        tempMatrix.postConcat(matrixX)
        tempMatrix.mapPoints(array)
        printArray(array)

        for (index in 0 until array.size step 2){
            //canvas.drawLine(array[index],array[index+1],array[index]+100f,array[index+1]+100f,circlePaint)
            //canvas.drawCircle(array[index]+150f,array[index+1]+150f,20f,circlePaint)

            canvas.drawCircle(array[index],array[index+1],20f,circlePaint)


        }

        val invertMatrix = Matrix()
        tempMatrix.invert(invertMatrix)

        val _touchX = mTouchX
        val _touchY = mTouchY-120f+150f
        val array2 = floatArrayOf(_touchX, _touchY)
        invertMatrix.mapPoints(array2)
        printArray(array2)


        val temp2Matrix = Matrix()
        temp2Matrix.postConcat(matrix)
        temp2Matrix.postConcat(matrixX)
        temp2Matrix.mapPoints(array2)

        printArray(array2)

        canvas.drawCircle(array2[0],array2[1],30f,circlePaint)


        //canvas.drawBitmap(BitmapFactory.decodeResource(context.resources, R.drawable.ic_launcher_foreground),0f,0f,circlePaint)




    }
    

    var mTouchX = 0f
    var mTouchY = 0f

    override fun onTouchEvent(event: MotionEvent?): Boolean {
        mTouchX = event?.x?:0f
        mTouchY = event?.y?:0f
        invalidate()
        return true
    }

    private fun px2dp(px: Float): Int {
        return TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, px, context.resources.displayMetrics).toInt()
    }

    private fun printArray(array: FloatArray) {
        val list = ArrayList<Float>()
        list.addAll(array.toList())
        Log.e("vic","$list")
    }

///
    // 安卓严格模式开启
    //1,线程策略模式
    // (
    // detectNetwork监测主线程使用的网络,
    // detectCustomSlowCalls监测自定义运行缓慢的函数,
    // penaltyLog输出日志,
    // penaltyDialog监测情况弹出对话框,
    // detectDiskReads监测在UI线程中读磁盘的操作
    // detectDiskWrites监测在UI线程中写磁盘的操作
    // detectResourceMismatches监测发现资源不匹配
    // detectAll 监测全部
    // permitDiskReads  允许UI线程在磁盘上读的操作
    // )
    //2,虚拟机策略
    // detectActivityLeaks检测Activity 的内存泄露情况
    // detectCleartextNetwork检测 明文网络传输
    // detectFileUriExposure检测file:// 或者是 content://
    // detectLeakedClosableObjects检测资源没有正确的关闭
    //detectLeakedRegistrationObjects检测BroadcastReceiver ServiceConnection 是否被释放
    //detectLeakedSqlLiteObjects检测数据库资源是否没有正确的关闭
    //setClassInstanceLimit设置某个类的同时处于内存中的实例上限 可以学协助检测内存泄露
    //penaltyLog输出日志
    //penaltyDeath 一旦检测到应用就会奔溃
    ///

    fun enabledStrictMode() {
        //开启Thread策略
        StrictMode.setThreadPolicy(
            StrictMode.ThreadPolicy.Builder()
                .detectCustomSlowCalls()//监测自定义运行缓慢的函数
                .detectDiskReads()//监测在UI线程中读磁盘的操作
                .detectDiskWrites()//监测在UI线程中写磁盘的操作
                .penaltyLog() //输出日志
                .penaltyDialog()//检测到上述问题就弹个警告框
                .build()
        )

        //开启VM 策略
        StrictMode.setVmPolicy(
            StrictMode.VmPolicy.Builder()
                .detectLeakedClosableObjects()//检测资源没有正确的关闭
                .setClassInstanceLimit(RxBusDemo01Activity::class.java, 1)//设置RxBusDemo01Activity 在内存的实例为1个
                .detectActivityLeaks()//检测Activity 的内存泄露情况
                .penaltyLog()//输出日志
               // .penaltyDeath()//一旦检测到应用就会奔溃
                .build()
        )

//        StrictMode.setThreadPolicy(
//            StrictMode.ThreadPolicy.Builder()
//                .detectAll()// 监测全部
//                .penaltyLog() //输出日志
//                .build()
//        )
//        //开启VM 策略
//        StrictMode.setVmPolicy(
//            StrictMode.VmPolicy.Builder()
//                .detectAll()
//                .penaltyLog()
//                .build()
//        )
    }
 
    
}
  • 6
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值