ImageView上的绿屏效果

时间:2014-12-16 08:12:47

标签: android imageview

我的目标是拥有一个"绿屏" ImageView和边框的效果。我有一个png边框,有一个厚实的轮廓,形状不规则,边框内外都是透明的。我想将它用作另一个图像的边框,比如照片,并且由于边框形状不规则,照片的某些部分可能位于边框之外。

所有这些装置都位于具有复杂渐变背景的布局的中心,所以我不能欺骗边框图像视图并用类似于底层父背景的颜色填充外部部分。

我最初的想法是使用一些图像编辑工具以不同的颜色填充png的内部和外部(绿色内部,黑色外部),将图像放在其后面,并使用生成的位图执行一些像素魔术,使得边框外的所有黑色像素都会穿过"整个画布因此显示父背景(复杂渐变背景),边框内的所有绿色像素将变为透明并显示其背后的照片。

对于一个看起来很简单的目标来说这听起来有点复杂,所以我推迟实施(甚至不确定它是否可行),直到我确信:

一个。我没有可以使用的现有库具有相同的效果

B中。有一个更好的解决方案可以产生相同的效果,但复杂程度要低得多。

2 个答案:

答案 0 :(得分:0)

尝试使用ColorFilter执行此操作:http://developer.android.com/intl/es/reference/android/graphics/ColorFilter.html

在此讨论中,您应该找到您想要的内容:Applying ColorFilter to ImageView with ShapedDrawable

答案 1 :(得分:0)

使用Bitmap.setPixel

开始工作
public static Bitmap combine(Bitmap b1, Bitmap b2) {
    try {
        int maxWidth = b1.getWidth();
        int maxHeight = b1.getHeight();
        Bitmap bmOverlay = Bitmap.createBitmap(maxWidth, maxHeight, b1.getConfig());
        Canvas canvas = new Canvas(bmOverlay);
        canvas.drawBitmap(b2, 0, 0, null);
        canvas.drawBitmap(b1, 0, 0, null);
        for (int index = 0; index < bmOverlay.getWidth(); index++) {
            for (int index2 = 0; index2 < bmOverlay.getHeight(); index2++) {
                if (bmOverlay.getPixel(index, index2) == Color.rgb(0, 255, 0)) { // or whatever outside color you set on your png
                    bmOverlay.setPixel(index, index2, Color.TRANSPARENT);
                }
            }
        }
        return bmOverlay;
    } catch (Exception e) {
        e.printStackTrace();
        return null;
    }
}

诀窍是将边框内部保持透明,然后用一个公差为0的纯色(如#00ff00)填充外部。对于阴影或alpha渐变边框不会有效,但是应该是纯色的。

用法:

Bitmap b1 = BitmapFactory.decodeResource(getResources(), R.drawable.profile_pic_border_alt);
Bitmap b2 = BitmapFactory.decodeResource(getResources(), R.drawable.panggap);
b2 = ThumbnailUtils.extractThumbnail(panggap, border.getWidth(), border.getHeight());

Bitmap b = combine(b1, b2);
imageView.setImageBitmap(b);