2014-01-14 3 views
1

프로그래밍 방식으로을 렌더링하면 가장자리가 희미 해져 TextView으로 렌더링됩니다. 어떤 모드에서 진정한 알파 그라디언트를 만들 수 있습니까?가장자리 페이딩에 해당하는 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

@ ZhenghongWang, 문제는 내가 원하는 가장자리 페이딩 결과를 얻을 수 없다는 것입니다. 나는'PorterDuff.Mode' 옵션을 모두 시험해 보았고 투명한 그라디언트 만 검은 색으로 그립니다. 레이아웃의'requireFadingEdge' 속성처럼 텍스트의 불투명도가 0으로 떨어지길 원합니다. –

+0

'PorterDuff'는 안드로이드의 공식 데모에서 두 개의 이미지를 겹치는 데 사용됩니다. 나는'애니메이션 '이 당신을 위해 이것을 할 수 있다고 생각합니다. –

답변

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); 
    } 
} 

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 !