使用Canvas绘制半透明位图(Android)

8

我有一个位图对象,想要将它以不同程度的半透明度呈现到画布对象上(即使整个位图部分透明)。例如,在游戏中我有精灵(绘制在位图背景的顶部),我想让它从不透明渐变到透明。我能否在不使用OpenGL的情况下实现这一点?

2个回答

12

您应该能够定义一个补间动画并将该动画应用于imageView。 XML资源文件类似于以下内容(命名为fade_animation.xml):

<?xml version="1.0" encoding="utf-8"?>
<alpha xmlns:android="http://schemas.android.com/apk/res/android"
   android:interpolator="@android:anim/linear_interpolator"
   android:fromAlpha="1.0"
   android:toAlpha="0.0"
   android:duration="100" />

然后,当准备好时,您将加载并将此动画应用于自定义imageView:

ImageView sprite = (ImageView) findViewById(R.id.sprite);
Animation animation = AnimationUtils.loadAnimation(this, R.anim.fade_animation);
sprite.startAnimation(animation);

还有其他的选择。如果你正在使用位图并且不想进行动画,则可以手动降低每一帧的 alpha 值,类似于这样:

paint.setAlpha(100);
canvas.drawBitmap(spriteImage, left, top, paint);

你尝试过这些选项中的任何一个吗?


-1

查看 Android 文档(它似乎基于 JSE,但具有完全不同的 GUI),以下代码将为您提供支持 alpha 通道的图像:

Bitmap bmp=createBitmap(100,100,Bitmap.Config.ARGB_8888);

只要源位图支持alpha通道,您就可以将其绘制到另一个位图上,并使其alpha值得到尊重。
要淡出它,您需要使用一些适当的延迟重复绘制图像(但是从计时器驱动的事件中进行,而不是在循环中,除非Android的渲染系统与其他Java非常不同),并在每次连续绘制时操作每个像素的alpha通道。
// Make image more transparent by 50%
int[] pxls=new int[100*100];
bmp.getPixels(pxls,0,100,0,0,100,100);
for(int xa=0,len=pxl.length; xa<len; xa++) {
    int alp=(pxls[xa] & 0xFF000000);
    alp<<1;
    pxls[xa]=(alp | (pxls[xa] & 0x00FFFFFF);
    }
bmp.setPixels(pxls,0,100,0,0,100,100);

注意事项1:我是根据JavaDoc现场编写的此代码;它尚未编译或测试。

注意事项2:如果硬件设备颜色分辨率不支持alpha通道(通常称为32位颜色),则将任何图像绘制到底层图形系统中可能会简单地忽略alpha通道。但在此之前对后备缓冲区图像进行的任何合成都应受到尊重。关键是您可能需要使用双缓冲绘画来执行alpha混合,同时免疫底层设备功能/配置。


谢谢提供代码。我知道这种方法,但是每帧循环几个小精灵会破坏我的帧速率。我以前写过这样的代码,循环和操作单个像素非常慢。因为有几个GUI元素具有快速淡入淡出效果,所以一定有更简单的方法。 - wordyword

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接