Android BitmapShader实现狙击瞄具十字交叉线准星,Kotlin
Android BitmapShader实现狙击瞄具十字交叉线准星,Kotlin
<?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>
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