Android: сделать определенный (зеленый) цвет в фоновом изображении прозрачным - PullRequest
0 голосов
/ 01 марта 2011

Я пишу приложение для Android.

в xml-файле, определяющем макет. У меня есть TabHost с 6 вкладками, которые имеют одинаковое большое фоновое изображение "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, что на фоновом изображении зеленые пиксели должны быть прозрачными?

Спасибо!

Ответы [ 3 ]

1 голос
/ 02 марта 2011

Просто, если у кого-то была такая же проблема, вот код:

//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));

в утилитах:

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;
}
1 голос
/ 05 февраля 2017

Этот фрагмент кода работал для меня:

PorterDuffColorFilter porterDuffColorFilter = new PorterDuffColorFilter(
    getResources().getColor(R.color.your_color),
    PorterDuff.Mode.MULTIPLY
);
imgView.getDrawable().setColorFilter(porterDuffColorFilter);
imgView.setBackgroundColor(Color.TRANSPARENT);
1 голос
/ 01 марта 2011

Вы должны были бы изменить каждый зеленый пиксель на прозрачный. Вот пример: Как изменить цвета Drawable в Android?

Однако, если в середине изображения есть зеленые пиксели, у вас могут возникнуть проблемы. Так что другой способ, если ваше изображение имеет постоянный размер и форму, создать маску и использовать режимы xfer для создания нового изображения с прозрачными закругленными углами.

...