Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/203.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Android-定制视图';s透明区域不可单击_Java_Android_Android View - Fatal编程技术网

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&&clickY0){
    返回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"
         .../>
    
    
    

现在它应该可以按照你的意愿工作了

PS:您可以使用透明图像或使用drawables中的xml文件创建自己的形状,然后使用src normaly导入形状


快乐编码:)

如果触摸到的坐标在视图的尺寸内,则应该是。还是整个屏幕都是这样?是的,应该是这样。但现在我想让它在圆圈内可触摸,无论是在维度内还是整个屏幕内。是的,我明白,我的意思是,你可以限制触摸事件。如果你检查了触摸记录的坐标,你可以说,例如,如果(x>200)->什么都不做,那么就做你自己的事情……你给出了一个答案。但这并不能解决我的问题。与前面的回答一样,视图基本上是矩形的。但我的视图是圆形的,在矩形视图布局中(实际上是视图框架)。谢谢你的回答,但这不是我的解决方案。这个想法使视图在圆圈内可点击,谢谢你的回答。Tnx,帮助很大!:)