当前位置: 首页 > article >正文

Android绘图Path基于LinearGradient线性动画渐变,Kotlin(2)

Android绘图Path基于LinearGradient线性动画渐变,Kotlin(2)

 

这篇

Android绘图Path基于LinearGradient线性渐变,Kotlin(1)-CSDN博客文章浏览阅读633次,点赞11次,收藏17次。Android SurfaceView简例Android中各的SurfaceView和View有很大的不同,两者应用场景不同。其中,LinearGradient 1,2,3只是修改渲染器的渲染模式,LinearGradient 1为重复(repeat),LinearGradient 2为镜像模式(mirror),Lin_android lineargradient。作者提供了`getPoints`方法和`FloatPoint`类的示例,以及`PaintView`组件在实际应用中的使用。https://blog.csdn.net/zhangphil/article/details/144508262画出的渐变线是静态的,下面实现动态动画的线性渐变:

 

import android.content.Context
import android.graphics.Canvas
import android.graphics.Color
import android.graphics.LinearGradient
import android.graphics.Paint
import android.graphics.Path
import android.graphics.Shader
import android.util.AttributeSet
import android.util.Log
import androidx.appcompat.widget.AppCompatImageView
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.delay
import kotlinx.coroutines.launch


class MyView : AppCompatImageView {
    private var mLinearGradient: LinearGradient? = null
    private var mPaint: Paint? = null
    private var mPath: Path? = null

    private var mStartX = 0f
    private var mStartY = 0f

    private var mEndX = 0f
    private var mEndY = 0f

    private val DELTA = 3f

    constructor(ctx: Context, attributeSet: AttributeSet) : super(ctx, attributeSet) {
        mPaint = Paint(Paint.ANTI_ALIAS_FLAG or Paint.FILTER_BITMAP_FLAG)
        mPaint?.style = Paint.Style.STROKE
        mPaint?.strokeWidth = 50f

        mPath = Path()
        mPath?.moveTo(mStartX, mStartY)

        val W = resources.displayMetrics.widthPixels
        val H = resources.displayMetrics.heightPixels

        val factor = H / W

        CoroutineScope(Dispatchers.IO).launch {
            while (true) {
                delay(5)

                mEndX = mEndX + DELTA
                mEndY = mEndX * factor//mEndY + DELTA

                Log.d("fly", "$mEndX $mEndY")

                mPath?.lineTo(mEndX, mEndY)

                mLinearGradient =
                    LinearGradient(
                        mStartX,
                        mStartY,
                        mEndX,
                        mEndY,
                        intArrayOf(Color.RED, Color.BLUE, Color.YELLOW),
                        null,
                        Shader.TileMode.CLAMP
                    )

                mPaint?.setShader(mLinearGradient)

                if (mEndX >= W || mEndY >= H) {
                    Log.d("fly", "break $mEndX $mEndY $W $H")
                    break
                }

                postInvalidate()
            }
        }
    }

    override fun onDraw(canvas: Canvas) {
        canvas.drawPath(mPath!!, mPaint!!)
    }
}

 

 

 

 


http://www.kler.cn/a/452296.html

相关文章:

  • 「Python数据科学」标量、向量、矩阵、张量与多维数组的辨析
  • 【Linux系列】Shell 脚本中的条件判断:`[ ]`与`[[ ]]`的比较
  • WebRTC服务质量(07)- 重传机制(04) 接收NACK消息
  • 源码分析之Openlayers中GeometryCollection类
  • CI/CD是什么?
  • vue3 Proxy替换vue2 defineProperty的原因
  • HarmonyOS NEXT 实战之元服务:静态案例效果---电台推荐
  • 【1224】数据结构(sizeof/数组的长度定义/读取字符串函数/线性表长度/左值右值/静态变量/指针与引用)
  • WPF自定义窗口 输入验证不生效
  • SpringBoot3-第四篇(基础特性)
  • Mybatisplus如何使用selectPage
  • 接口测试Day03-postman断言关联
  • HuaWei、NVIDIA 数据中心 AI 算力对比
  • 谈谈JSON
  • DigitalOcean Droplet 云服务器:新增自动扩展池功能
  • npm : 无法加载文件 D:\Nodejs\node_global\npm.ps1,因为在此系统上禁止运行脚本
  • openwrt 负载均衡方法 openwrt负载均衡本地源接口
  • 08 Django - Django媒体文件静态文件文件上传
  • Ubuntu存储硬盘扩容-无脑ChatGPT方法
  • 嵌入式学习-QT-Day06
  • 网站使用站群服务器都有哪些好处?
  • Vue学习手册03 Vue虚拟DOM详解
  • mysql,数据库主从同步搭建
  • 帝国cms电脑pc站url跳转到手机站url的方法
  • 20241225在ubuntu22.04.5下使用smartmontools命令查看ssd的寿命
  • Diffusers使用笔记