Java Android-定制视图';s透明区域不可单击
我有一个圆形的自定义视图 圆圈有一个触摸监听器,当它被触摸时会显示动画。 (我将使用一个红点作为参考。) 但问题是,当我触摸圆圈外侧时,动画会显示出来,这是无用的Java Android-定制视图';s透明区域不可单击,java,android,android-view,Java,Android,Android View,我有一个圆形的自定义视图 圆圈有一个触摸监听器,当它被触摸时会显示动画。 (我将使用一个红点作为参考。) 但问题是,当我触摸圆圈外侧时,动画会显示出来,这是无用的 因此,我的问题是,我可以让这个视图在圆内可触摸吗?您可以覆盖视图中的触摸事件,并检查它与圆中心的距离是否小于其半径 这需要这样做,因为Android上的视图基本上都是矩形的。是的,我们可以让特定的视图在屏幕上可触摸/可点击。您的主屏幕将在布局内,圆圈将作为视图的一部分。启动应用程序时,setcontentView将膨胀布局,并且
因此,我的问题是,我可以让这个视图在圆内可触摸吗?您可以覆盖视图中的触摸事件,并检查它与圆中心的距离是否小于其半径
这需要这样做,因为Android上的视图基本上都是矩形的。是的,我们可以让特定的视图在屏幕上可触摸/可点击。您的主屏幕将在布局内,圆圈将作为视图的一部分。启动应用程序时,setcontentView将膨胀布局,并且您的主布局将是所有其他视图的父视图。我们可以使用finviewByID获取视图,并且可以将touchListner/clickListner实现为该视图,而不是全屏/布局。这将解决您的问题。我知道这有点晚了,但它可能会帮助正在寻找答案的人:
- 第一:从ImageView继承,如下所示:
public class CustomImageView extends ImageView implements View.OnTouchListener { private Bitmap bitmap; private OnClickListener listener; private boolean clicking; private int pressedColor; public CustomImageView(Context context) { super(context); init(); } public CustomImageView(Context context, AttributeSet attrs) { super(context, attrs); init(); } public CustomImageView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); init(); } @Override public void setOnClickListener(OnClickListener l) { listener = l; setOnTouchListener(this); } @Override public boolean onTouch(View view, MotionEvent motionEvent) { if (isInClickArea(motionEvent)) { if (motionEvent.getActionMasked() == MotionEvent.ACTION_DOWN) { clicking = true; setColorFilter(pressedColor, PorterDuff.Mode.MULTIPLY); } else if (motionEvent.getActionMasked() == MotionEvent.ACTION_UP) { if (clicking) { clicking = false; setColorFilter(null); listener.onClick(view); } } return true; } clicking = false; setColorFilter(null); return false; } private boolean isInClickArea(MotionEvent event) { int clickX = (int)(event.getX() * ((double) bitmap.getWidth() / (double) getWidth())); int clickY = (int)(event.getY() * ((double) bitmap.getHeight() / (double) getHeight())); if (bitmap != null) { if (clickX >= 0 && clickX < bitmap.getWidth() && clickY >= 0 && clickY < bitmap.getHeight()) { if (Color.alpha(bitmap.getPixel(clickX, clickY)) > 0) { return true; } } } return false; } private void init() { int color = (int)(255 * 0.96 f); pressedColor = Color.rgb(color, color, color); Drawable drawable = getDrawable(); if (drawable != null) { if (drawable instanceof BitmapDrawable) { bitmap = ((BitmapDrawable) drawable).getBitmap(); } else if (drawable instanceof LayerDrawable) { bitmap = Bitmap.createBitmap(128, 128, Bitmap.Config.ARGB_8888); drawable.setBounds(0, 0, 128, 128); drawable.draw(new Canvas(bitmap)); } } } }
公共类CustomImageView扩展ImageView实现View.OnTouchListener{ 私有位图; 私人监听; 私有布尔点击; 私有内压彩色; 公共CustomImageView(上下文){ 超级(上下文); init(); } 公共CustomImageView(上下文、属性集属性){ 超级(上下文,attrs); init(); } 公共CustomImageView(上下文上下文、属性集属性、int defStyleAttr){ super(上下文、attrs、defStyleAttr); init(); } @凌驾 公共void setOnClickListener(OnClickListener l){ 监听器=l; setOnTouchListener(这个); } @凌驾 公共布尔onTouch(视图、运动事件、运动事件){ if(isInClickArea(运动事件)){ if(motionEvent.getActionMasked()==motionEvent.ACTION\u向下){ 单击=真; 设置颜色过滤器(按颜色、PorterDuff.Mode.MULTIPLY); }else if(motionEvent.getActionMasked()==motionEvent.ACTION\u UP){ 如果(单击){ 点击=假; setColorFilter(空); onClick(视图); } } 返回true; } 点击=假; setColorFilter(空); 返回false; } 私有布尔值isInClickArea(运动事件){ int clickX=(int)(event.getX()*((double)bitmap.getWidth()/(double)getWidth()); int clickY=(int)(event.getY()*((double)bitmap.getHeight()/(double)getHeight()); if(位图!=null){ 如果(clickX>=0&&clickX
=0&&clickY 0){ 返回true; } } } 返回false; } 私有void init(){ int颜色=(int)(255*0.96华氏度); pressedColor=Color.rgb(颜色,颜色,颜色); Drawable Drawable=getDrawable(); 如果(可绘制!=null){ if(BitmapDrawable的可绘制实例){ 位图=((BitmapDrawable)drawable.getBitmap(); }else if(图层的可绘制实例可绘制){ bitmap=bitmap.createBitmap(128,128,bitmap.Config.ARGB_8888); 可拉深.立根(0,0,128,128); 绘制(新画布(位图)); } } } } - 第二:在布局中设置ImageView:
<FrameLayout android:layout_width="wrap_content" android:layout_height="wrap_content" > <com.myapp.custom.CustomImageView android:id="@+id/button_id" android:src="@drawable/image_with_transparent_area" .../>
快乐编码:)如果触摸到的坐标在视图的尺寸内,则应该是。还是整个屏幕都是这样?是的,应该是这样。但现在我想让它在圆圈内可触摸,无论是在维度内还是整个屏幕内。是的,我明白,我的意思是,你可以限制触摸事件。如果你检查了触摸记录的坐标,你可以说,例如,如果(x>200)->什么都不做,那么就做你自己的事情……你给出了一个答案。但这并不能解决我的问题。与前面的回答一样,视图基本上是矩形的。但我的视图是圆形的,在矩形视图布局中(实际上是视图框架)。谢谢你的回答,但这不是我的解决方案。这个想法使视图在圆圈内可点击,谢谢你的回答。Tnx,帮助很大!:)