2014-01-14 91 views
1

我想以编程方式呈现TextView的边缘褪色。通过哪种模式,我可以创建一个真正的alpha梯度?PorterDuff.Mode等效于边缘褪色

一个真正的边缘衰落应顺利地从1.0减少透明度(没有覆盖梯度劈)至0.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); 
} 

我试过所有的组合,他们都没有工作?这是不可能的吗?

+0

你有定期无效'TextView'? –

+0

@郑红旺,问题是我无法获得所需的边缘衰落结果。我尝试了所有的'PorterDuff.Mode'选项,它只画黑到透明渐变。我想让文本的不透明度像布局'requireFadingEdge'属性一样淡化为零。 –

+0

'PorterDuff'用于在android官方演示中重叠两个图像。我认为'动画'可以为你做到这一点。 –

回答

0

这是我用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); 
    } 
} 

gradient.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" /> 

values.xml

<drawable name="background">#FF0000</drawable> 

结果(活动背景为红色) Yeah !