在活动上创建一个黑色透明的图层

时间:2013-06-13 03:55:30

标签: android

我想在活动上创建一个透明层的图层,我需要只显示一个特定的视图,例如“登录按钮”。这意味着在图层上制作的孔与按钮的大小完全相同。请任何人帮我解决这个问题。

提前致谢。

4 个答案:

答案 0 :(得分:2)

如果我理解你的问题

Activity的父版布局将为RelativeLayout。在底部的父布局中添加另一个子RelativeLayout,其中包含宽度和高度的match_parent参数。然后,您可以将此#99000000的颜色设置为其背景。这将为您提供一个黑色透明层,而不是父母。

像这样的东西

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/parentLayout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#FFFFFF">

    <!-- here you add your activities views ect... -->

    <RelativeLayout
        android:id="@+id/childLayout"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="#99000000">
        <!-- This will be your overlay so here you can add your login button ect -->
    </RelativeLayout>

</RelativeLayout>

我没有对此进行测试,但它应该可以解决您的问题

答案 1 :(得分:1)

以编程方式,您可以使用Canvas创建图层。用你的颜色填充整个东西并切出一个洞。

public class DrawView extends View {
    Paint paint = new Paint();
    Paint transparentPaint = new Paint;
    public DrawView(Context context) {
        super(context);            
    }

    @Override
    public void onDraw(Canvas canvas) {
        //first fill everything with your covering color
        paint.setColor(yourTransparentColor);
        canvas.drawRect(0, 0, canvas.getWidth(), canvas.getHeight(), paint);
        //now clear out the area you want to see through
        transparentPaint.setAlpha(0xFF);
        transparentPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.CLEAR));
        Rect rect=new Rect(left, top, right, bottom);//make this your rect!
        canvas.drawRect(rect,transparentPaint);
    }
}

答案 2 :(得分:1)

在接下来的“HalR”步骤中,我能够实现透明背景感谢他,发现你们中的一些人在透明层上做的切割上得到黑色是由于图形渲染。可以使用onDraw方法

中的下面的代码启用
` @Override
public void onDraw(Canvas canvas) {


        if (android.os.Build.VERSION.SDK_INT >= 11) {
            setLayerType(View.LAYER_TYPE_SOFTWARE, null);
        }
     .....
     ..... // your draw rect creation and other stuff `

通过消除音高黑色

,可以让你拥有透明区域

答案 3 :(得分:0)

如果我理解你的问题,那么这就是你想要的: 您尝试在活动上叠加透明视图并剪切孔以查看很少的内容。

在这里我找到了一个有用的例子,它展示了如何剪切位图并将它们组合起来。我建议你的问题只是切割位图,并记得设置imageview背景为不透明度,如下所示

  

机器人:背景=&#34;#00FFFFFF&#34;

这是我创建的布局

  

    <ImageButton
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:background="@android:color/transparent"
    android:src="@drawable/ic_launcher"
    android:layout_alignParentRight="true"
    android:layout_alignParentBottom="true"/>"

    <ImageView
        android:id="@+id/img"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="#00ffffff"
        android:scaleType="centerCrop" >
    </ImageView>


</RelativeLayout>

这是我的疯狂

  

公共类MainActivity扩展了Activity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    ImageView iv = (ImageView) findViewById(R.id.img);
    Bitmap foreground = BitmapFactory.decodeResource(getResources(), R.drawable.android_cat_wanted);
    foreground = punchAHoleInABitmap(foreground);
    iv.setImageBitmap(foreground);
}

private Bitmap punchAHoleInABitmap(Bitmap foreground) {
    Bitmap bitmap = Bitmap.createBitmap(foreground.getWidth(), foreground.getHeight(), Bitmap.Config.ARGB_8888);
    Canvas canvas = new Canvas(bitmap);
    Paint paint = new Paint();
    canvas.drawBitmap(foreground, 0, 0, paint);
    paint.setAntiAlias(true);
    paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.CLEAR));
    float radius = (float)(getScreenSize().x *.35);
    float x = (float) ((getScreenSize().x*.5));
    float y = (float)  ((getScreenSize().y*.5));
    canvas.drawCircle(x, y, radius, paint);
    return bitmap;
}

@SuppressLint("NewApi")
private Point getScreenSize() {
    WindowManager window = (WindowManager) getSystemService(Context.WINDOW_SERVICE); 
    Display display = window.getDefaultDisplay();
    Point size = new Point();
    display.getSize(size);
    return size;
}

}

希望你觉得它很有用