【问题标题】:ImageView doesn't show underlying View when parts of it made transparent当 ImageView 的一部分变为透明时,它不显示底层视图
【发布时间】:2023-03-11 00:31:02
【问题描述】:

我有一个RelativeLayout,上面有一个View 和一个ImageView
现在,我正在修改ImageView 的位图的一部分,使其透明并使该区域无效。
这行得通,但我没有看到下面的第一个 View,只是 Activity 的背景。
尝试使 Viewandroid.R.id.content 无效,但没有运气。

问题:鉴于View A 覆盖View B,当View A 的各个部分变为透明时,如何使View B 的部分可见?

【问题讨论】:

  • 你能发布xml吗?
  • 考虑到你的问题,这应该是自动的,最近做了一些项目,我只是把 imageview 放在其他组件上,然后你用手指擦除图像,没什么特别的。提供更多信息,例如 xml 或您可以分享的内容,可能还有其他问题。
  • 是 ImageView 的位图背景或来源。您确定视图重叠吗?

标签: android android-layout layout imageview android-relativelayout


【解决方案1】:

这是我的条带解决方案,先截图方便理解

XML:

  <?xml version="1.0" encoding="utf-8"?>
  <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
   android:id="@+id/RelativeLayout1"
   android:layout_width="match_parent"
   android:layout_height="match_parent"
   android:background="@drawable/bck"
   android:orientation="vertical" >

<View
    android:id="@+id/view1"
    android:layout_width="200dp"
    android:layout_height="200dp"
    android:layout_alignParentLeft="true"
    android:layout_alignParentTop="true"
    android:background="@drawable/view" />

<com.example.stackoverflow.CustomView
    android:id="@+id/CustomView1"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentLeft="true"
    android:layout_alignParentTop="true"
    android:src="@drawable/imageview" />

  </RelativeLayout>

主活动:

public class MainActivity extends Activity implements OnClickListener{  

private CustomView imageView;

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    imageView = (CustomView)findViewById(R.id.CustomView1);
    imageView.setOnClickListener(this);
}


@Override
public void onClick(View v) {
    imageView.drawCircle();
}
}

自定义视图:

  public class CustomView extends ImageView {

private Canvas mCanvas;
private Paint mBitmapPaint;
private Paint mPaint;
private Bitmap mBitmap;

public CustomView(Context context) {
    super(context);
    initialize();
}

public CustomView(Context context, AttributeSet attrs) {
    super(context, attrs);
    initialize();
}

public CustomView(Context context, AttributeSet attrs, int defStyle) {
    super(context, attrs, defStyle);
    initialize();
}

private void initialize() {
    if (!isInEditMode()) {      
        mBitmapPaint = new Paint(Paint.DITHER_FLAG);            
        mBitmapPaint.setStyle(Style.STROKE);

        mPaint = new Paint();
        mPaint.setStyle(Style.FILL);
        mPaint.setStrokeWidth(50);
        mPaint.setMaskFilter(null);             
        mPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.CLEAR));

        reset();
    }
}

public void reset(){
    Bitmap bmp = ((BitmapDrawable)getDrawable()).getBitmap();
    mBitmap = bmp.copy(Bitmap.Config.ARGB_8888, true);

    this.setVisibility(View.VISIBLE);

    mCanvas = new Canvas(mBitmap);
}   

public void drawCircle(){
    mCanvas.drawCircle(this.getWidth() / 2, this.getHeight() / 2, this.getWidth() / 2, mPaint);

    //this.setImageBitmap(mBitmap);
    this.invalidate();
}

@Override
protected void onDraw(Canvas canvas) {
    if (isInEditMode()) {
        super.onDraw(canvas);
    }
    else {
        //super.onDraw(canvas);
           mBitmapPaint.setColor(0xFF000000);
           if(mBitmap != null){
            canvas.drawBitmap(mBitmap, 0, 0, mBitmapPaint);         
              }
       }
   }

  }

注意注释部分,您可以像我一样将透明图像设置为可绘制或重绘,这取决于您的其他需求。另请注意,PNG 图像已经具有 Alpha 通道。

希望这对您有所帮助并享受您的工作。

【讨论】:

    【解决方案2】:

    问题在于位图本身。

    这是我将其转换为可变的方式:

    Bitmap mutableBitmap = sourceBitmap.copy(bm.getConfig(), true); // getConfig() returned ARGB_8888
    

    这里是如何工作的:

    Bitmap mutableBitmap = Bitmap.createBitmap(bm.getWidth(), bm.getHeight(),
                        bm.getConfig());
    Canvas canvas = new Canvas(mutableBitmap);
    canvas.drawBitmap(sourceBitmap, 0, 0, null);
    

    【讨论】:

      【解决方案3】:

      尝试将相对布局更改为 Framelayout

      【讨论】:

      • 这还不算接近 :)
      猜你喜欢
      • 2012-11-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多