Android BitmapShader实现狙击瞄具十字交叉线准星,Kotlin

Android BitmapShader实现狙击瞄具十字交叉线准星,Kotlin

XML 复制代码
<?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.MyView
        android:id="@+id/mv"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="@android:color/darker_gray" />
</RelativeLayout>
Kotlin 复制代码
import android.content.Context
import android.graphics.BitmapFactory
import android.graphics.BitmapShader
import android.graphics.Canvas
import android.graphics.Color
import android.graphics.Paint
import android.graphics.Path
import android.graphics.Shader
import android.util.AttributeSet
import android.view.MotionEvent
import androidx.appcompat.widget.AppCompatImageView


class MyView : AppCompatImageView {
    private var mPaint: Paint = Paint()
    private var mLinePaint: Paint = Paint()
    private var mPath: Path = Path()
    private var mPreX = 0f
    private var mPreY = 0f
    private var mRadius = 400f
    private var mBitmapShader: BitmapShader? = null

    private val mResId = R.mipmap.p

    constructor(ctx: Context, attributeSet: AttributeSet) : super(ctx, attributeSet) {
        //mPaint.style = Paint.Style.STROKE
        //mPaint.strokeWidth = 20f

        mLinePaint.style = Paint.Style.STROKE
        mLinePaint.strokeWidth = 5f
        mLinePaint.color = Color.RED

        val bmp = BitmapFactory.decodeResource(resources, mResId, null)
        mBitmapShader = BitmapShader(bmp, Shader.TileMode.CLAMP, Shader.TileMode.REPEAT)

        mPaint.setShader(mBitmapShader)
    }

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

        canvas.drawCircle(mPreX, mPreY, mRadius, mPaint)

        val pts = floatArrayOf(mPreX, mPreY - 50, mPreX, mPreY + 50, mPreX - 50, mPreY, mPreX + 50, mPreY)
        canvas.drawLines(pts, mLinePaint) //十字交叉线。
    }

    override fun onTouchEvent(event: MotionEvent): Boolean {
        when (event.action) {
            MotionEvent.ACTION_DOWN -> {
                mPath.moveTo(event.x, event.y)
                mPreX = event.x
                mPreY = event.y

                return true
            }

            MotionEvent.ACTION_MOVE -> {
                val endX = (mPreX + event.x) / 2
                val endY = (mPreY + event.y) / 2
                mPath.quadTo(mPreX, mPreY, endX, endY)

                mPreX = event.x
                mPreY = event.y
            }

            MotionEvent.ACTION_UP -> {

            }
        }

        postInvalidate()

        return super.onTouchEvent(event)
    }
}

当手指在屏幕上滑动时候,动态的以十字交叉线中心点为中心框选绘制圆:

下方开始repeat绘图,是因为BitmapShader的Y设置为REPEAT。

Android BitmapShader更简易的实现刮刮乐功能,Kotlin-CSDN博客文章浏览阅读312次,点赞6次,收藏12次。Android拼接合并图片生成长图代码实现合并两张图片,以第一张图片的宽度为标准,如果被合并的第二张图片宽度和第一张不同,那么就以第一张图片的宽度为准线,对第二张图片进行缩放。Android Bitmap保存成至手机图片文件,Kotlin_android bitmap保存图片-CSDN博客。Android拼接合并图片生成长图代码实现合并两张图片,以第一张图片的宽度为标准,如果被合并的第二张图片宽度和第一张不同,那么就以第一张图片的宽度为准线,对第二张图片进行缩放。https://blog.csdn.net/zhangphil/article/details/145143789Android基于Matrix绘制PaintDrawable设置BitmapShader,以手指触点为中心显示原图像圆图,Kotlin_matrix drawbitmap android-CSDN博客文章浏览阅读1.1k次,点赞25次,收藏21次。需要注意的,因为在xml布局里面特别设置了ImageView的高度为wrap_content,手指在屏幕触点的位置是放大镜里面放大图片后准确圆心位置,但是,如果ImageView设置成match_parent,则因为ImageView里面的Bitmap被缩放(此处Bitmap其实小于ImageView,被拉伸了),拉伸后的Bitmap水平方向坐标与ImageView一直重合,但竖直方向,Bitmap坐标与ImageView不一致,会造成一种现象,手指触点放大镜放大后,水平方向是正确的,但竖直方向有偏移量。_matrix drawbitmap androidhttps://zhangphil.blog.csdn.net/article/details/135374279Android BitmapShader setLocalMatrix缩放Bitmap高度重新onMeasure,Kotlin_android setlocalmatrix-CSDN博客文章浏览阅读1.3k次,点赞22次,收藏17次。Android横竖屏切换View设置不同尺寸或等比例缩放的自定义View的onMeasure解决方案(2)附录文章1以xml布局文件方式实现了一个view在横竖屏切换时候的大小尺寸缩放,实现这种需求,也可以使用自定义View的onMeasure方法实现。遗留问题,手指在上图滑动过程中,当滑动到一定区域,下面的切图框中已无太有效的图可以"放大",后续可以填充黑色,表示无效放大。所有的绘制轨迹线,都限定在了绿色的圆角矩形框中,超出区域不予绘制。基础上,限定下面切图的绘制区域,超出绿色区域的轨迹线不再绘制。_android setlocalmatrixhttps://blog.csdn.net/zhangphil/article/details/135982934Android基于Matrix绘制PaintDrawable设置BitmapShader,以手指触点为中心显示原图像圆图,Kotlin(2)_paint设置bitmap-CSDN博客文章浏览阅读788次,点赞11次,收藏8次。【代码】Android基于Matrix绘制PaintDrawable设置BitmapShader,以手指触点为中心显示原图像圆图,Kotlin(2)_paint设置bitmaphttps://blog.csdn.net/zhangphil/article/details/135508123

相关推荐
m0_748239833 小时前
MySQL Workbench菜单汉化为中文
android·数据库·mysql
千里马学框架5 小时前
安卓java端service如何在native进程进行访问-跨进程通讯高端知识
android·java·开发语言·安卓framework开发·车机·跨进程·安卓窗口系统
xuexizhe775 小时前
从 Android 进行永久删除照片恢复的 5 种方法
android·智能手机·电脑·手机·笔记本电脑
NULL->NEXT5 小时前
Java(面向对象进阶——接口)
android·java·开发语言
余额不足121386 小时前
Linux 操作二:文件映射与文件状态
android·linux·服务器
处女座_三月7 小时前
使用QQ登录(头条项目-09)
android·python·django
carl.xu8 小时前
android T 建立文件夹及文件的记录
android
2401_892102589 小时前
MySQL 尽量避免使用 TIMESTAMP!!
android·mysql·adb
潇凝子潇9 小时前
Mysql 设置 慢SQL时间并触发邮件
android·sql·mysql