【发布时间】:2010-07-26 16:17:10
【问题描述】:
我有一个 Bitmap 对象,并希望将其渲染为具有不同半透明级别的 Canvas 对象(即使整个位图部分透明)。例如,我在游戏中有想要从不透明到不可见淡出的精灵(绘制在位图背景的顶部)。我可以在不使用 OpenGL 的情况下做到这一点吗?
【问题讨论】:
我有一个 Bitmap 对象,并希望将其渲染为具有不同半透明级别的 Canvas 对象(即使整个位图部分透明)。例如,我在游戏中有想要从不透明到不可见淡出的精灵(绘制在位图背景的顶部)。我可以在不使用 OpenGL 的情况下做到这一点吗?
【问题讨论】:
您应该能够定义补间动画并将该动画应用于 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);
您是否尝试过这些选项中的任何一个?
【讨论】:
查看 Android 文档(看起来基于 JSE 并带有完全替代的 GUI),以下将为您提供 alpha 通道支持图像:
Bitmap bmp=createBitmap(100,100,Bitmap.Config.ARGB_8888);
只要 source 位图支持 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 混合,同时不受底层设备功能/配置的影响。
【讨论】: