这是我使用 ImageView 的解决方案。我使用 GradientDrawable 作为 alpha。
活动:
@Override
protected void onCreate (Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
getWindow().setBackgroundDrawableResource(R.drawable.background);
GradientImageView giv = new GradientImageView(this);
giv.setImageResource(R.drawable.bttf);
giv.setScaleType(ImageView.ScaleType.CENTER_CROP);
setContentView(giv);
}
class GradientImageView extends ImageView
{
Drawable mDrawableMask;
Paint mPaintMask;
Bitmap mOriginal, mBitmapMask;
Canvas mCanvasOriginal, mCanvasMask;
public GradientImageView (final Context context)
{
super(context);
if (android.os.Build.VERSION.SDK_INT >= 11)
setLayerType(View.LAYER_TYPE_SOFTWARE, null);
mDrawableMask = getResources().getDrawable(R.drawable.gradient);
mPaintMask = new Paint();
mPaintMask.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_OUT));
}
protected void setMask (Drawable mask)
{
mDrawableMask = mask;
mBitmapMask = null;
}
@Override
protected void onDraw (final Canvas canvas)
{
if (mOriginal == null)
{
mOriginal = Bitmap.createBitmap(getWidth(), getHeight(), Bitmap.Config.ARGB_8888);
mCanvasOriginal = new Canvas(mOriginal);
}
super.onDraw(mCanvasOriginal);
if (mBitmapMask == null)
{
mBitmapMask = Bitmap.createBitmap(getWidth(), getHeight(), Bitmap.Config.ARGB_8888);
mCanvasMask = new Canvas(mBitmapMask);
mDrawableMask.setBounds(0, 0, getWidth(), getHeight());
mDrawableMask.draw(mCanvasMask);
}
canvas.drawBitmap(mOriginal, 0, 0, null);
canvas.drawBitmap(mBitmapMask, 0, 0, mPaintMask);
}
}
渐变.xml
<?xml version="1.0" encoding="utf-8"?>
<gradient
android:angle="-90"
android:centerColor="@android:color/transparent"
android:centerY="0.5"
android:endColor="@android:color/black"
android:startColor="@android:color/transparent" />
值.xml
<drawable name="background">#FF0000</drawable>
结果(活动背景为红色)
