如何在Android中的drawable中交换红色和蓝色?

时间:2014-01-03 12:14:07

标签: java android colorfilter

有人能告诉我一种将彩色滤镜应用于Android中的Drawable的有效方法,它基本上会变成蓝红色和红蓝色吗?

我在Java中有一个功能正常的例子,但这在Android中不兼容:

public class ColourSwapTest extends JFrame {

    private JPanel panel;
    private boolean altImageOnShow = false;

    public static void main(String[] args){
        new ColourSwapTest();
    }

    public ColourSwapTest(){
        init();

        Container container = this.getContentPane();

        panel = new JPanel(){
            @Override
            public void paint(Graphics g){
                if (altImageOnShow){
                    g.drawImage(img, 0, 0, null);
                }
                else {
                    g.drawImage(src, 0, 0,  null);
                }
            }
        };
        panel.addMouseListener(new MouseAdapter(){
            @Override
            public void mouseClicked(MouseEvent arg0){
                // alternate between original and filtered image
                if (altImageOnShow){
                    altImageOnShow = false;
                }
                else {
                    altImageOnShow = true;
                }
                repaint();
            }
        });
        container.add(panel, BorderLayout.CENTER);

        this.setSize(800,600);
        this.setLocationRelativeTo(null);
        this.setVisible(true);
    }

    private String dir = "c:/Test Images/2.jpg";
    private Image src;
    private ImageFilter colourFilter;
    private Image img;

    /**
     * init()
     */
    private void init(){
        try {  
            src = ImageIO.read(new File(dir));  
        }
        catch (IOException e) {  
            e.printStackTrace();
        }
        colourFilter = new RedBlueSwapFilter();
        // apply filter to new image
        img = createImage(new FilteredImageSource(src.getSource(), colourFilter));
    }

    /**
     * CLASS
     * RedBlueSwapFilter
     */
    class RedBlueSwapFilter extends RGBImageFilter {
        public RedBlueSwapFilter() {
            canFilterIndexColorModel = true;
        }

        public int filterRGB(int x, int y, int rgb) {
            return ((rgb & 0xff00ff00)
                    | ((rgb & 0xff0000) >> 16)
                    | ((rgb & 0xff) << 16));
        }
    }
}

这只会加载在C:\ Test Images \ 2.jpg中找到的图像,并在您点击它时在其原始状态和更改状态之间切换。

如果有人可以就如何将其引入Android提出建议,我将非常感激。感谢。

编辑:我应该补充一点,单击图像来切换它是完全不重要的,这正是我所做的,以证明它的工作。我需要的关键是尽可能高效地在运行时以红色和蓝色的方式翻转颜色。

3 个答案:

答案 0 :(得分:2)

我已经解决了,chaps。方法如下:

private Drawable invertImage(Drawable inputDrawable){
    Bitmap bitmap = ((BitmapDrawable) inputDrawable).getBitmap();

    int width = bitmap.getWidth();
    int height = bitmap.getHeight();

    int[] pixels = new int[width * height];
    bitmap.getPixels(pixels, 0, width, 0, 0, width, height);

    int[] finalArray = new int[width * height];

    for(int i = 0; i < finalArray.length; i++) {
        int red = Color.red(pixels[i]);
        int green = Color.green(pixels[i]);
        int blue = Color.blue(pixels[i]);
        finalArray[i] = Color.rgb(blue, green, red);
    }
    bitmap = Bitmap.createBitmap(finalArray, width, height, Bitmap.Config.ARGB_8888);

    return new BitmapDrawable(getResources(),bitmap);
}

答案 1 :(得分:0)

你可以从你的drawable中获取Bitmap并设置一个颜色过滤器,看看这个链接:

How to change Bitmap image color in android?

当我需要多种颜色的drawable颜色时,我会使用这种方法,只需将其绘制为黑色,然后应用颜色过滤器

答案 2 :(得分:-1)

你需要制作一个选择器xml文件,这里描述http://developer.android.com/guide/topics/resources/drawable-resource.html

可能的实施方式如下:

<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@drawable/button_focused_pressed" android:state_pressed="true"/>
    <item android:drawable="@drawable/button_focused" android:state_focused="true"/>
    <item android:drawable="@drawable/button_disabled" android:state_enabled="false"/>
    <item android:drawable="@drawable/button_normal"/>

对于每个支持的按钮状态,您需要创建一个新的.png。将此文件保存在资源的drawable文件夹中(例如button.xml)并将其应用于按钮,就像应用普通png一样。