我正在为Android编写应用程序。
在一个定义布局的xml文件中我有一个带有6个标签的TabHost,它们都有相同的大背景图片“settingsdlg.gif”。
<TabHost xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@android:id/tabhost"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="@drawable/settingsdlg" >
..
在styles.xml中,我指定窗口必须是透明的:
<resources>
<style name="my_app_style" parent="@android:style/Theme.Dialog">
<item name="android:windowNoTitle">true</item>
<item name="android:windowBackground">@android:color/transparent</item>
</style>
问题是背景图像“settingsdlg.gif”是圆形矩形,边缘的小区域(应该是透明的)是绿色的。
我知道要在Android上使用图像透明度,图像必须是PNG格式,我想透明的像素应该在PNG中保存为透明。
不幸的是我从数据库中获取图像并且无法更改它们,因为它们也用于Win32和Mac的其他应用程序。
有没有办法告诉Android在背景图像中绿色像素应该呈现透明?
谢谢!
答案 0 :(得分:1)
您必须将每个绿色像素更改为透明像素。以下是一个示例:How to change colors of a Drawable in Android?
但是,如果图像中间有绿色像素,则可能会出现问题。所以另一种方法是,如果您的图像具有恒定的大小和形状,则创建一个蒙版并使用xfer模式创建一个具有透明圆角的新图像。
答案 1 :(得分:1)
如果有人遇到同样的问题,请输入以下代码:
//remove green edges from bg image
Bitmap bgBitmap = ((BitmapDrawable)getResources().getDrawable(R.drawable.settingsdlg)).getBitmap();
Bitmap transparentBgBitmap = Utils.getBitmapWithTransparentBG(bgBitmap, Color.GREEN);
tabHost.setBackgroundDrawable(new BitmapDrawable(transparentBgBitmap));
在Utils中:
public static Bitmap getBitmapWithTransparentBG(Bitmap srcBitmap, int bgColor) {
Bitmap result = srcBitmap.copy(Bitmap.Config.ARGB_8888, true);
int nWidth = result.getWidth();
int nHeight = result.getHeight();
for (int y = 0; y < nHeight; ++y)
for (int x = 0; x < nWidth; ++x) {
int nPixelColor = result.getPixel(x, y);
if (nPixelColor == bgColor)
result.setPixel(x, y, Color.TRANSPARENT);
}
return result;
}
答案 2 :(得分:1)
此代码段对我有用:
PorterDuffColorFilter porterDuffColorFilter = new PorterDuffColorFilter(
getResources().getColor(R.color.your_color),
PorterDuff.Mode.MULTIPLY
);
imgView.getDrawable().setColorFilter(porterDuffColorFilter);
imgView.setBackgroundColor(Color.TRANSPARENT);