使用具有完全透明背景的png在ImageView下面着色阴影

时间:2011-12-05 14:03:34

标签: android transparency png-transparency

我正在研究Gingerbread(2.3.3)设备。我有一个ImageView,其中包含一个箭头图,并有一个完全透明的背景,我需要在一些背景上绘制。问题是在ImageView的边界框下面有一个“阴影”工件 如果你仔细观察下面的图像,你会看到我正在谈论的神器:1

前景图像和背景图像都有alpha通道,因此被解码为ARGB8888(我通过手动将其资源解码为位图来对此进行双重检查,打印出显示ARGB8888的位图配置,然后将它们分配给各自的视图)。在调用setContentView()之前,我还将Activitiy的窗口配置为PixelFormat.RGBA_8888。

请不要将我推荐给建议将位图解码为ARGB8888和/或将窗口设置为RGBA_8888的线程,因为我尝试了两种解决方案,但没有帮助。

任何想法如何解决此问题?

修改

这是设置Window像素格式和drawables的函数(直接从onCreate()调用):

public void testTransparency() {
    getWindow().setFormat(PixelFormat.RGBA_8888);
    setContentView(R.layout.transparency_test);
    LinearLayout ll = (LinearLayout)findViewById(R.id.ll);      
    Bitmap bgBmp = BitmapFactory.decodeResource(getResources(), R.raw.bg);
    Log.d(TAG,"BG BMP Config: " + bgBmp.getConfig());
    ll.setBackgroundDrawable(new BitmapDrawable(bgBmp));
    ImageView iv = (ImageView)findViewById(R.id.iv);
    iv.setBackgroundDrawable(null);
    Bitmap arrowBmp = BitmapFactory.decodeResource(getResources(), R.raw.big_arrow);
    Log.d(TAG,"Arrow BMP Config: " + arrowBmp.getConfig());
    iv.setImageBitmap(arrowBmp);
}

这是我的测试使用的(非常简单的)布局:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
    android:id="@+id/ll"  
    android:layout_width="fill_parent"  
    android:layout_height="fill_parent"  
    android:orientation="vertical"  
    android:gravity="center">

<ImageView android:id="@+id/iv"
    android:layout_width="72dp"
    android:layout_height="120dp"
    /></LinearLayout>

可以在2发现'bg'资源 'big_arrow'资源可在“http://i.imgur.com/3V6QU.png”找到

编辑2:
我发现我无法在模拟器上重现问题,也无法在我的N1(2.3.4)或XOOM(3.2.1)上重现问题。这里有两个选项:
1.问题是设备特定的(基于Android的设备我正在研究)
2.在渲染透明PNG时,2.3.4和32BPP帧缓冲存在特定问题。

感谢。

2 个答案:

答案 0 :(得分:0)

发现错误,实际上这是一个特定于平台的错误。

当我删除SKIA混合blitting部分中的霓虹灯优化时(在SkBlitRow_D32.cpp - SkBlitRow :: Proc32 SkBlitRow :: Factory32(无符号标志))中,我发现阴影神器消失了

对于想要调试此类错误的人来说,这是一个有用的提示:
您始终可以将视图层次结构绘制到位图(例如,请参阅:Android get a bitmap of a view before drawing?),然后使用 Bitmap.compress 方法将位图导出为PNG文件。这样,您可以使用其Alpha通道获取视图层次结构快照(由于它是在合成后生成的,因此不显示在A DDMS屏幕截图中)。我发现阴影区域内的alpha值为'1'而不是'0',从而创建了工件。

答案 1 :(得分:0)

只需设置

BackButton.setBackgroundColor(Color.TRANSPARENT);

使用Android 2.3.5在HTC Desire HD上使用ImageButton解决了我的问题,其中我的按钮图像的高度低于默认背景。经验观察;神器没有在Android 4.1.2的Galaxy Note 1上显示