2012-08-28 40 views
2

如何在图像上应用alpha渐变以使其线性淡入? 现在,我创建了单位宽度的矩形,并使用它来绘制具有绘制对象的位图,并在循环中更改了Alpha值。我只是做了它,因为我想不出别的。所以一个更好的方法会更好。在图像上创建alpha渐变以创建淡入淡出效果

Bitmap bitmap = BitmapFactory.decodeStream(is); 
Bitmap bmp = Bitmap.createScaledBitmap(bitmap, 100, 151, true)); 
bitmap.recycle(); 

Rect Rect1 = new Rect(0, 0, 100, 100); 
Rect Rect2 = new Rect(100, 0, 101, 100); 

Paint paint = new Paint(); 

canvas.drawBitmap(bmp, Rect1, Rect1, null); 
while (paint.getAlpha() != 0) { 
    paint.setAlpha(paint.getAlpha() - 5); 
    canvas.drawBitmap(bmp, Rect2, Rect2, paint); 
    Rect2.set(Rect2.left + 1, Rect2.top, Rect2.right + 1, Rect2.bottom); 
} 

像这样的事情

Picture Alpha Gradient

附:我正在尝试为动态壁纸做到这一点。

+0

您尝试过GradientDrawable吗?也许有可能把它放在透明的上面...... – sandrstar

+0

@sandrstar我想对图像应用渐变,以便它后面的任何东西都可见。 我想你说的是我可以使用GradientDrawable在图像上放置一个颜色渐变? –

+0

这可以用opengl来完成,但我怀疑你想要走这条路。 – WIllJBD

回答

9

可能只有视图操作才能满足所需的行为。 对于它,你应该:

  • 准备形状绘制

RES /绘制/ gradient_shape.xml:

<?xml version="1.0" encoding="utf-8"?> 
<shape xmlns:android="http://schemas.android.com/apk/res/android"> 
    <gradient 
      android:startColor="#00FFFFFF" 
      android:endColor="#FFFFFFFF" 
      android:type="linear" /> 
</shape> 
  • 定义布局:activity_main.xml中

    <ImageView 
        android:id="@+id/photo" 
        android:layout_width="match_parent" 
        android:layout_height="match_parent" 
        android:background="@drawable/photo" 
        android:src="@drawable/gradient_shape" /> 
    

    这里绘制/照片是刚刚的JPEG文件夹可绘制;

  • 一些建议以下的代码添加到活性(它实际上,取决于器件天然构型和似乎是多余的用于现在> 3.0的设备):

    public void onAttachedToWindow() { 
        super.onAttachedToWindow(); 
        Window window = getWindow(); 
        window.setFormat(PixelFormat.RGBA_8888); 
    } 
    

我后在我的4.1设备上观察到以下情况: Sample image

它看起来像渐变。我仍然不确定您是否在寻找。

+0

这就是我所得到的。但是如果我有一个图像作为布局的背景设置,我希望它开始变得可见而不是颜色。 添加了一张显示我想要的图片。 –

+0

已经尝试了一些自定义视图和着色器的东西(像这里一样的水平http://stackoverflow.com/questions/5231260/android-shader-behave-different-in-ondrawcanvas-and-new-canvasbitmap,像添加alpha通道解码图像并尝试使用渐变着色器绘制),但不幸的是没有足够的时间来制定完整的解决方案。你有没有试过这种方式? – sandrstar

+0

感谢您的链接。我还没试过。我改用opengl,因为对于这个以及我正在尝试做的其他一些东西,画布太慢了。 我会试试看,并回复你。 –