7

アクティビティの上に透明なレイヤーを持つレイヤーを作成したいのですが、たとえば「ログインボタン」など、特定のビューのみを表示する必要があります。これは、ボタンのサイズに合わせてレイヤーに穴をあけることを意味します。誰でも私を助けてください。

前もって感謝します。

4

4 に答える 4

2

あなたの質問を正しく理解できれば

の親レイアウトは にActivityなりますRelativeLayoutmatch_parent下部の親レイアウトで、幅と高さの両方のパラメーターを実装する別の子 RelativeLayout を追加します。次に、このような色を#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>

私はこれをテストしませんでしたが、それはあなたの問題を解決するはずです

于 2013-06-13T04:39:07.290 に答える
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);
    }
}
于 2013-06-13T04:42:28.610 に答える
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 `

これにより、真っ黒な色を排除して透明な領域を確保できます

于 2015-11-03T13:44:44.630 に答える
0

私があなたの質問を理解したなら、これはあなたが望んでいたものです: あなたはアクティビティに透明なビューを重ねて、いくつかのものを見るために穴を切り取ろうとしました.

ここで、ビットマップを切り取って組み合わせる方法を示す便利な例を見つけました。ここに示すように、ビットマップを切り取ってイメージビューの背景を不透明に設定することを忘れないでください。

android:background="#00ffffff"

これが私が作成したレイアウトです

    <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>

そして、これは私のマニアックです

public class MainActivity extends 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;
}

}

あなたがそれが役に立つことを願っています

于 2015-09-05T23:36:46.670 に答える