如何在用户单击的图像视图中标记位置
How to mark a positions in an imageview where the has user clicked
我的 android 应用程序中有一个图像视图:
<ImageView
android:layout_width="250dp"
android:layout_height="250dp"
android:id="@+id/imageviewMap"
/>
还有一个 onTouchlistener 来获取用户点击的位置
imageviewMap.setOnTouchListener(object : View.OnTouchListener {
override fun onTouch(v: View?, event: MotionEvent?): Boolean {
event?.let { e ->
drawCross(e.x,e.y)
}
return true
}
})
需要的是在用户点击的位置(或上方)画一个十字。 (多次)
如何实现drawCross方法?
这是我的解决方案。感谢 Kabir 的有用提示。
我使用了两个图像视图,一个用于背景,一个透明的用于标记
<ImageView
android:layout_width="250dp"
android:layout_height="250dp"
android:id="@+id/imageviewMap"
android:src="@drawable/map"
/>
<ImageView
android:layout_width="250dp"
android:layout_height="250dp"
android:id="@+id/imageviewCrosses"
/>
触摸监听器
imageviewMap.setOnTouchListener { view, event ->
event?.let { e ->
if(event.action == MotionEvent.ACTION_UP) {
val x = convertPixelsToDp(e.x, this.applicationContext)
val y = convertPixelsToDp(e.y, this.applicationContext)
drawCross(x,y)
}
}
true
}
像素dp转换方法
fun convertPixelsToDp(px: Float, context: Context): Float{
return px / (context.resources.displayMetrics.densityDpi / DisplayMetrics.DENSITY_DEFAULT.toFloat())
}
fun convertDpToPixels(dp: Float, context: Context): Float {
return dp * (context.resources.displayMetrics.densityDpi / DisplayMetrics.DENSITY_DEFAULT.toFloat())
}
drawCross方法(测试时画了一个圆)
fun drawCross(x: Float, y: Float) {
val bitmap = Bitmap.createBitmap(
250,
250,
Bitmap.Config.ALPHA_8
)
val canvas = Canvas(bitmap)
canvas.drawColor(Color.TRANSPARENT)
val paint = Paint()
paint.color = Color.RED
paint.style = Paint.Style.STROKE
paint.strokeWidth = 1.0f
paint.isAntiAlias = true
canvas.drawCircle(
x,
y,
10.0f,
paint
)
imageviewCrosses.setImageBitmap(bitmap)
}
我的 android 应用程序中有一个图像视图:
<ImageView
android:layout_width="250dp"
android:layout_height="250dp"
android:id="@+id/imageviewMap"
/>
还有一个 onTouchlistener 来获取用户点击的位置
imageviewMap.setOnTouchListener(object : View.OnTouchListener {
override fun onTouch(v: View?, event: MotionEvent?): Boolean {
event?.let { e ->
drawCross(e.x,e.y)
}
return true
}
})
需要的是在用户点击的位置(或上方)画一个十字。 (多次)
如何实现drawCross方法?
这是我的解决方案。感谢 Kabir 的有用提示。
我使用了两个图像视图,一个用于背景,一个透明的用于标记
<ImageView
android:layout_width="250dp"
android:layout_height="250dp"
android:id="@+id/imageviewMap"
android:src="@drawable/map"
/>
<ImageView
android:layout_width="250dp"
android:layout_height="250dp"
android:id="@+id/imageviewCrosses"
/>
触摸监听器
imageviewMap.setOnTouchListener { view, event ->
event?.let { e ->
if(event.action == MotionEvent.ACTION_UP) {
val x = convertPixelsToDp(e.x, this.applicationContext)
val y = convertPixelsToDp(e.y, this.applicationContext)
drawCross(x,y)
}
}
true
}
像素dp转换方法
fun convertPixelsToDp(px: Float, context: Context): Float{
return px / (context.resources.displayMetrics.densityDpi / DisplayMetrics.DENSITY_DEFAULT.toFloat())
}
fun convertDpToPixels(dp: Float, context: Context): Float {
return dp * (context.resources.displayMetrics.densityDpi / DisplayMetrics.DENSITY_DEFAULT.toFloat())
}
drawCross方法(测试时画了一个圆)
fun drawCross(x: Float, y: Float) {
val bitmap = Bitmap.createBitmap(
250,
250,
Bitmap.Config.ALPHA_8
)
val canvas = Canvas(bitmap)
canvas.drawColor(Color.TRANSPARENT)
val paint = Paint()
paint.color = Color.RED
paint.style = Paint.Style.STROKE
paint.strokeWidth = 1.0f
paint.isAntiAlias = true
canvas.drawCircle(
x,
y,
10.0f,
paint
)
imageviewCrosses.setImageBitmap(bitmap)
}