2017-08-29 7 views
1

1つのImageViewが前面にあり、もう1つが背景にあるRelativeLayoutを使用しています。このキャンバスメソッドを使用して正面のImageViewを半透明にしていました。ImageViewsを切り取るためのキャンバスメソッド

private Bitmap createTriangleImageTop(Bitmap bitmap) { 
    Bitmap bmp; 

    bmp = Bitmap.createBitmap(bitmap.getWidth(), 
      bitmap.getHeight(), Bitmap.Config.ARGB_8888); 
    BitmapShader shader = new BitmapShader(bitmap, 
      BitmapShader.TileMode.CLAMP, 
      BitmapShader.TileMode.CLAMP); 

    float radius = bitmap.getWidth()/2f; 
    Canvas canvas = new Canvas(bmp); 
    Paint paint = new Paint(); 
    paint.setAntiAlias(true); 
    paint.setShader(shader); 

    Path path = new Path(); 
    path.moveTo(0, 0); 
    path.lineTo(bitmap.getWidth()-5, 0); 
    path.lineTo(0, bitmap.getHeight()-5); 
    path.lineTo(0, 0); 
    path.close(); 
    canvas.drawPath(path, paint); 

    return bmp; 
} 

それがどのように見える:私は、バックグラウンドでImageViewのをクリックすると、http://imgur.com/i13BTb7

だから私は前のImageViewのからOnclickListenerを取得します。前面のImageViewをクリックすると、前面からOnClickListenerが取得されます。

明らかに、ImageViewを1つクリックして関連付けられたOnClickListenerを取得できるようにするため、bringToFront()でBackgroundImageViewを前面に持ってきてくれませんか?

答えて

1

問題の原因は、Android Viewが長方形であることです。あなたのトップイメージの半分は透明ですが、それでもまだ正方形全体をカバーしています。だから、 "背景をクリック"すると、実際には前景の透明部分をクリックしています。

必要な動作を取得するには、フォアグラウンドのクリックリスナーをタッチリスナーに変更し、ユーザーが不透明領域内をクリックしたときにのみ動作をトリガします。

foreground.setOnTouchListener(new View.OnTouchListener() { 
     @Override 
     public boolean onTouch(View v, MotionEvent event) { 
      if (event.getX() + event.getY() <= v.getWidth()) { 
       switch (event.getAction()) { 
        case MotionEvent.ACTION_DOWN: 
         return true; 

        case MotionEvent.ACTION_UP: 
         // your code here 
         return true; 
       } 
      } 

      return false; 
     } 
    }); 

私はそれは、正方形の左上半分のだかどうかをチェックするためにevent.getX() + event.getY() <= v.getWidth()を使用しています。前景レイヤーがわずかに異なる場合は、より複雑な計算が必要になる場合があります。

ユーザーが透明領域をクリックすると、前景がタッチを処理しないことを示します。falseを返します。これにより、タッチは前景を「通過」し、背景によって処理されます。

+0

実際にはかなり良いアイデアです、ありがとう:) –

関連する問題