我正在尝试在图像视图中加载从设备的摄像头返回的图像,并获得我触摸的像素的颜色。
我尝试缩放xml文件中的图像,但是当我这样做时,尽管我看到图像适合在imageview中,但触摸侦听器将按图像的原始尺寸工作。 如果不缩放比例,我只会看到适合图像视图的图像部分,而触摸侦听器将获得实际像素。
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
if (requestCode == REQUEST_IMAGE_CAPTURE && resultCode == Activity.RESULT_OK) {
bitmap = BitmapFactory.decodeFile(mCurrentPhotoPath)
ivCamera.setImageBitmap(bitmap)
ivCamera.setOnTouchListener { view, motionEvent ->
val bmp = (ivCamera.drawable as BitmapDrawable).bitmap
val pixel = bmp.getPixel(motionEvent!!.x.toInt(), motionEvent.y.toInt())
pixelRed = Color.red(pixel)
pixelGreen = Color.green(pixel)
pixelBlue = Color.blue(pixel)
tvColor.setBackgroundColor(Color.rgb(pixelRed!!, pixelGreen!!, pixelBlue!!))
true
}
}
}
<ImageView android:layout_width="match_parent"
android:layout_weight="0.7"
android:layout_height="0dp"
android:id="@+id/ivCamera"
android:scaleType="matrix"
android:background="@android:drawable/ic_menu_report_image"
app:layout_constraintEnd_toEndOf="parent"
android:layout_marginEnd="8dp"
android:layout_marginStart="8dp"
app:layout_constraintHorizontal_bias="0.498"
android:layout_margin="10dp"
android:layout_marginBottom="8dp"
android:adjustViewBounds="true"
app:layout_constraintBottom_toBottomOf="parent"
android:contentDescription="PicureTaken"/>
如果我在xml文件中缩放图像,则会看到该图像适合显示在imageview中,但touchlistener会按图像的原始尺寸工作。 如果不缩放比例,我只会看到适合图像视图的图像部分,而触摸侦听器将获得实际像素。
答案 0 :(得分:0)
这可能是您在XML缩放类型ivCamera.setOnTouchListener
生效之前设置触摸监听器ivCamera.setImageBitmap
的那些疯狂场景之一。也就是说,它可以在scaleType
生效之前对原始尺寸进行设置。
在ImageView放大后,您可以使用布局侦听器设置触摸侦听器。
https://developer.android.com/reference/android/view/ViewTreeObserver.OnGlobalLayoutListener
ivCamera.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
ivCamera.getViewTreeObserver().removeOnGlobalLayoutListener(this);
if(ivCamera.getDrawable() != null) {
ivCamera.setOnTouchListener {
// etc
// ...
}
}
});
这不是我有信心的答案,而是一个答案。 :-)对不起,它是如此可怕/如此骇人!
再看一遍...
val bmp = (ivCamera.drawable as BitmapDrawable).bitmap
val pixel = bmp.getPixel(motionEvent!!.x.toInt(), motionEvent.y.toInt())
您将位图从ImageView中取回,然后调用getPixel
,但是显然.bitmap
会返回您原始大小的位图,即使您使用scaleType
对其进行了缩放(用于视图)
我的建议是将触摸事件的x / y坐标转换为缩放的图像大小。
或在ImageView上调用setImageBitmap
之前自行缩放位图。这样,您就无需翻译x / y。