1

のエッジ フェードをプログラムでレンダリングしたいと考えていますTextView。どのモードで真のアルファ グラデーションを作成できますか?

実際のエッジ フェードは、透明度を から までスムーズに減らし (オーバーレイ グラディエント ハックなし) 1.00.0トップ ビューが背景ビューにフェードインするようにします。

@Override
protected void onDraw(Canvas canvas) {
    super.onDraw(canvas);

    int y = 0;
    int height = 300;
    int width = getWidth();

    LinearGradient shader = new LinearGradient(width / 2, y, width / 2, y + height, 0xff000000, 0x0000000, Shader.TileMode.CLAMP);

    Paint p = new Paint();
    p.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.XXX)); // Which mode works?
    p.setShader(shader);

    canvas.drawRect(0, y, width, y + height, p);
}

すべての組み合わせを試しましたが、どれも機能しませんでしたか? そうすることは不可能ですか?

4

1 に答える 1

0

これがImageViewを使用した私のソリューションです。アルファには GradientDrawable を使用します。

アクティビティ:

@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>

結果(アクティビティの背景は赤) うん !

于 2015-02-04T13:43:25.403 に答える