Android: 透明背景imageView重叠点击问题
Android: clicking issue of overlapping imageViews with transparent background
我有两个部分重叠的可点击 imageView,假设一个大的在底部作为基础,小的在它的右上角。示例视图:this。黑色圆圈是我在获取大图像的听众时遇到问题的地方。
问题是,透明区域是不可见的,但仍然存在,导致onTouch动作不是这样"accurate"。例如。点击重叠区域,小图透明,大图不透明,会检测到小图,但我想要的是检测到大图。
使用 onTouchListener 捕捉颜色使透明区域不可点击也无济于事。
请问我该如何解决?
ImageView big, small;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_seventh);
big = (ImageView) findViewById(R.id.imageViewBig);
small = (ImageView) findViewById(R.id.imageViewSmall);
big.setOnTouchListener(this);
small.setOnTouchListener(this);
}
@Override
public boolean onTouch(View v, MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_DOWN) {
switch (v.getId()) {
case R.id.imageViewBig:
Toast.makeText(this, "Big", Toast.LENGTH_SHORT).show();
break;
case R.id.imageViewSmall:
Toast.makeText(this, "Small", Toast.LENGTH_SHORT).show();
break;
default:
Toast.makeText(this, "none", Toast.LENGTH_SHORT).show();
}
}
return true;
}
xml:
<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="match_parent"
tools:context="com.gamification.gamificationpagestudy.ProgressBar.SeventhActivity">
<ImageView
android:id="@+id/imageViewBig"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:layout_centerVertical="true"
android:clickable="true"
android:src="@drawable/germany" />
<ImageView
android:id="@+id/imageViewSmall"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignEnd="@+id/imageViewBig"
android:layout_alignRight="@+id/imageViewBig"
android:layout_alignTop="@+id/imageViewBig"
android:clickable="true"
android:src="@drawable/brazil" />
</RelativeLayout>
感谢 Dreo 的建议 :D
继续使用onTouchListner获取透明区域,同时获取被触摸的View的中点以检查左下角或右下角区域是否被触摸,然后执行您的操作,在我的例子中左下角是我的GridView的项目在位置0 , 右下角是位置 1 的项目:
if (color == Color.TRANSPARENT) {
int touchX = (int) event.getX();
int touchY = (int) event.getY();
int middle_width = v.getWidth()/2;
int middle_height = v.getHeight()/2;
if (touchX < middle_width && touchY > middle_height) // bottom left
Toast.makeText(GamificationMainActivity.this, gvAdapter.getItem(0), Toast.LENGTH_SHORT).show();
else if (touchX > middle_width && touchY > middle_height) // bottom right
Toast.makeText(GamificationMainActivity.this, gvAdapter.getItem(1), Toast.LENGTH_SHORT).show();
return true;
} else { //... }
我有两个部分重叠的可点击 imageView,假设一个大的在底部作为基础,小的在它的右上角。示例视图:this。黑色圆圈是我在获取大图像的听众时遇到问题的地方。
问题是,透明区域是不可见的,但仍然存在,导致onTouch动作不是这样"accurate"。例如。点击重叠区域,小图透明,大图不透明,会检测到小图,但我想要的是检测到大图。
使用 onTouchListener 捕捉颜色使透明区域不可点击也无济于事。
请问我该如何解决?
ImageView big, small;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_seventh);
big = (ImageView) findViewById(R.id.imageViewBig);
small = (ImageView) findViewById(R.id.imageViewSmall);
big.setOnTouchListener(this);
small.setOnTouchListener(this);
}
@Override
public boolean onTouch(View v, MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_DOWN) {
switch (v.getId()) {
case R.id.imageViewBig:
Toast.makeText(this, "Big", Toast.LENGTH_SHORT).show();
break;
case R.id.imageViewSmall:
Toast.makeText(this, "Small", Toast.LENGTH_SHORT).show();
break;
default:
Toast.makeText(this, "none", Toast.LENGTH_SHORT).show();
}
}
return true;
}
xml:
<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="match_parent"
tools:context="com.gamification.gamificationpagestudy.ProgressBar.SeventhActivity">
<ImageView
android:id="@+id/imageViewBig"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:layout_centerVertical="true"
android:clickable="true"
android:src="@drawable/germany" />
<ImageView
android:id="@+id/imageViewSmall"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignEnd="@+id/imageViewBig"
android:layout_alignRight="@+id/imageViewBig"
android:layout_alignTop="@+id/imageViewBig"
android:clickable="true"
android:src="@drawable/brazil" />
</RelativeLayout>
感谢 Dreo 的建议 :D
继续使用onTouchListner获取透明区域,同时获取被触摸的View的中点以检查左下角或右下角区域是否被触摸,然后执行您的操作,在我的例子中左下角是我的GridView的项目在位置0 , 右下角是位置 1 的项目:
if (color == Color.TRANSPARENT) {
int touchX = (int) event.getX();
int touchY = (int) event.getY();
int middle_width = v.getWidth()/2;
int middle_height = v.getHeight()/2;
if (touchX < middle_width && touchY > middle_height) // bottom left
Toast.makeText(GamificationMainActivity.this, gvAdapter.getItem(0), Toast.LENGTH_SHORT).show();
else if (touchX > middle_width && touchY > middle_height) // bottom right
Toast.makeText(GamificationMainActivity.this, gvAdapter.getItem(1), Toast.LENGTH_SHORT).show();
return true;
} else { //... }