我的代码如下。它与此问题的解决方案中的代码完全相同:Make certain area of bitmap transparent on touch
和其他许多人一样,我对这段代码也有同样的问题:圈子变黑了。
我使用PNG文件作为我的叠加层,此文件没有任何透明区域。但是,只要我在Photoshop中向PNG添加任意透明区域,代码就会开始工作,并且圆圈显示为透明。
显然,图像有一些东西,它的透明度如何设定,但我不知道是什么。我需要使用没有任何透明区域的PNG作为我的叠加层。
任何建议?
编辑:好的代码不能取决于叠加图像是否具有透明度,我正在寻找一种方法来处理任何类型的图像作为我的叠加层,无论是JPG,PNG还是别的。
编辑2:如果我在复制位图时使用Config.ARGB_4444
,则会创建Alpha通道,但此格式会降低图像质量。 API级别11及更高级别的API Bitmap.setHasAlpha()但到目前为止我使用的是10级。
public class MainActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(new TouchView(this));
}
class TouchView extends View {
Bitmap bgr;
Bitmap overlayDefault;
Bitmap overlay;
Paint pTouch;
int X = 100;
int Y = 100;
Canvas c2;
public TouchView(Context context) {
super(context);
bgr = BitmapFactory.decodeResource(
getResources(),
R.drawable.background);
overlay = BitmapFactory.decodeResource(
getResources(),
R.drawable.foreground)
.copy(Config.ARGB_8888, true);
c2 = new Canvas(overlay);
pTouch = new Paint(Paint.ANTI_ALIAS_FLAG);
pTouch.setXfermode(
new PorterDuffXfermode(Mode.SRC_OUT));
pTouch.setColor(Color.TRANSPARENT);
}
@Override
public void onDraw(Canvas canvas){
super.onDraw(canvas);
//draw background
canvas.drawBitmap(bgr, 0, 0, null);
//copy the default overlay
// into temporary overlay and punch a hole in it
//c2.drawBitmap(overlayDefault, 0, 0, null);
c2.drawCircle(X, Y, 80, pTouch);
//draw the overlay over the background
canvas.drawBitmap(overlay, 0, 0, null);
}
}
}
答案 0 :(得分:1)
来自http://blog.uncommons.org/2011/01/12/adjusting-the-opacity-of-an-android-bitmap/
**
* @param bitmap The source bitmap.
* @param opacity a value between 0 (completely transparent) and 255 (completely opaque).
* @return The opacity-adjusted bitmap. If the source bitmap is mutable it will be
* adjusted and returned, otherwise a new bitmap is created.
*/
private Bitmap adjustOpacity(Bitmap bitmap, int opacity)
{
Bitmap mutableBitmap = bitmap.isMutable()
? bitmap
: bitmap.copy(Bitmap.Config.ARGB_8888, true);
Canvas canvas = new Canvas(mutableBitmap);
int colour = (opacity & 0xFF) << 24;
canvas.drawColor(colour, PorterDuff.Mode.DST_IN);
return mutableBitmap;
}
请注意,ARGB_4444的Bitmap.Config文档说:
该字段在API级别13中已弃用。由于质量差 在这种配置中,建议改为使用ARGB_8888。