Aplicar una máscara a una sola vista de superposición sin enmascarar toda la actividad

Tengo una actividad simple con un fondo verde y estoy tratando de proporcionar un recubrimiento rojo con un área circular transparente. Aquí está el efecto que estoy tratando de lograr:

Imagen esperada

Con el código que he encontrado en Internet, esto es lo que veo:

Resultado del código

Lo que parece estar ocurriendo es que PorterDuff se aplica a todas las vistas de la actividad en lugar de a la que le dije claramente. Muchos de los mensajes de Stack han sido acerca de enmascarar un mapa de bits con otro mapa de bits y estoy tratando de enmascarar una parte de una vista con una forma circular creada mediante programación. Aquí está el código que estoy intentando usar:

public class ClippingTestActivity extends Activity { private Paint mPaint; ClippingView ddd; public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); this.setContentView(R.layout.test); View v = new View(this.getBaseContext()); v.setBackgroundColor(Color.GREEN); this.addContentView(v, new LinearLayout.LayoutParams(LinearLayout.LayoutParams.FILL_PARENT, LinearLayout.LayoutParams.FILL_PARENT)); ClippingView r = new ClippingView(this.getBaseContext()); r.setBackgroundColor(Color.RED); this.addContentView(r, new LinearLayout.LayoutParams(LinearLayout.LayoutParams.FILL_PARENT, LinearLayout.LayoutParams.FILL_PARENT)); } } public class ClippingView extends View { Paint paint = new Paint(); Path path = new Path(); public ClippingView(Context context) { super(context); } @Override public void onDraw(Canvas canvas) { super.onDraw( canvas ); paint.setColor(Color.TRANSPARENT); paint.setStyle(Style.FILL); paint.setXfermode( new PorterDuffXfermode( Mode.CLEAR ) ); int cx = 200; int cy = 200; int radius = 50; canvas.drawCircle( cx, cy, radius, paint ); } } 

Con el archivo xml de diseño como tal

 <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res/com.appspot.scruffapp" android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_centerHorizontal="true" android:background="#ff0000"> </RelativeLayout> 

¿Alguien sabe cómo lograr el efecto?

Bueno. Con la ayuda de un amigo me di cuenta. Resulta que necesitaba para crear un nuevo lienzo que estaba vacío y pasar que alrededor de la función a la función y dibujar el lienzo en una nueva vista que se agrega más tarde. Este es el código que funcionó para mí:

 Bitmap circle = DrawView.makeCircle(drawable); Bitmap overlayBg = DrawView.makeOverlayBg(canvas.getWidth(),canvas.getHeight()); Bitmap finalImage = Bitmap.createBitmap(canvas.getWidth(),canvas.getHeight(), Bitmap.Config.ARGB_8888); final android.graphics.Canvas tmpCanvas = new android.graphics.Canvas(finalImage); tmpCanvas.drawBitmap(overlayBg, 0, 0, null); final android.graphics.Paint paint = new android.graphics.Paint(); paint.setXfermode(new android.graphics.PorterDuffXfermode(Mode.DST_OUT)); tmpCanvas.drawBitmap(circle, cx - radius, cy - radius, paint); canvas.drawBitmap(finalImage, 0, 0, null); 
  • ¿Hay una manera de desplazarse mediante programación una vista de desplazamiento a un texto de edición específico?
  • Vista superficial en capas en un FrameLayout en Android
  • Webview con inicio de sesión de Windows parpadeando en el cuadro de diálogo
  • Vista dinámica con desplazamiento horizontal y vertical
  • Carga de CSS móvil si el usuario está en Android
  • SendUserActionEvent () es null
  • Android WebView ZoomManager.onSizeChanged NullPointerException
  • ExpandableListView - la indicación de grupo es extensible para ajustarse al tamaño del texto
  • addView no funciona
  • Textview dentro de RelativeLayout en la vista personalizada ¿No se aplica la gravedad correctamente?
  • Personalizar el indicador TabLayout. ¿Haciendo la esquina de la esquina del indicador de la pestaña?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.