2016-05-29 12 views
0

私は可能な限りすべてオンラインで試しましたが、このメソッドは一貫して呼び出されません。 onDraw()メソッドが呼び出されることもあり、ときには無視されることもあります。 お願いします。助けてください。 BadgeDrawableクラス:(アクションバーでの私の通知アイコンへのバッジを描きたい)DrawableクラスのOnDraw()メソッドが呼び出されません

public class BadgeDrawable extends Drawable { 

private float mTextSize; 
private Paint mBadgePaint; 
private Paint mBadgePaint1; 
private Paint mTextPaint; 
private Rect mTxtRect = new Rect(); 

private String mCount = ""; 
private boolean mWillDraw = false; 

public BadgeDrawable(Context context) { 
    mTextSize = /*context.getResources().getDimension(R.dimen.badge_text_size)*/ 20; 
    mBadgePaint = new Paint(); 
    mBadgePaint.setColor(ResourceReader.getInstance(context).getColorFromResource(R.color.colorPrimary)); 
    mBadgePaint.setAntiAlias(true); 
    mBadgePaint.setStyle(Paint.Style.FILL); 
    mBadgePaint1 = new Paint(); 
    mBadgePaint1.setColor(Color.parseColor("#FFFFFF"));//white 
    mBadgePaint1.setAntiAlias(true); 
    mBadgePaint1.setStyle(Paint.Style.FILL); 

    mTextPaint = new Paint(); 
    mTextPaint.setColor(Color.WHITE); 
    mTextPaint.setTypeface(Typeface.DEFAULT); 
    mTextPaint.setTextSize(mTextSize); 
    //mTextPaint.setFlags(Paint.FAKE_BOLD_TEXT_FLAG); 
    mTextPaint.setAntiAlias(true); 
    mTextPaint.setTextAlign(Paint.Align.CENTER); 
    this.setCallback(callback); 
} 

@Override 
public void draw(Canvas canvas) { 

    Log.d("dj", "onDraw BadgeDrawable"); 
    if (!mWillDraw) { 
     return; 
    } 

    Rect bounds = getBounds(); 
    float width = bounds.right - bounds.left; 
    float height = bounds.bottom - bounds.top; 
    float radius = ((Math.max(width, height)/2))/2; 
    float centerX = (width - radius - 1) +10; 
    float centerY = radius -5; 
    if(mCount.length() <= 2){ 
     // Draw badge circle. 
     /*canvas.drawCircle(centerX, centerY, radius+9, mBadgePaint1); 
     canvas.drawCircle(centerX, centerY, radius+7, mBadgePaint);*/ 

     canvas.drawCircle(centerX, centerY, radius+9, mBadgePaint1); 
     canvas.drawCircle(centerX, centerY, radius+7, mBadgePaint); 
    } 
    else{ 
     /*canvas.drawCircle(centerX, centerY, radius+10, mBadgePaint1); 
     canvas.drawCircle(centerX, centerY, radius+8, mBadgePaint);*/ 

     canvas.drawCircle(centerX, centerY, radius+10, mBadgePaint1); 
     canvas.drawCircle(centerX, centerY, radius+8, mBadgePaint); 
    } 
    // Draw badge count text inside the circle. 
    mTextPaint.getTextBounds(mCount, 0, mCount.length(), mTxtRect); 
    float textHeight = mTxtRect.bottom - mTxtRect.top; 
    float textY = centerY + (textHeight/2f); 
    /*if(mCount.length() > 2) 
    canvas.drawText("99+", centerX, textY, mTextPaint); 
    else*/ 
    canvas.drawText(mCount, centerX, textY, mTextPaint); 
} 

/* 
Sets the count (i.e notifications) to display. 
    */ 
public void setCount(String count) { 
    Log.d(Constants.TAG, "setCount count val- BadgeDrawable: "+count); 
    mCount = count; 
    // Only draw a badge if there are notifications. 
    mWillDraw = !count.equalsIgnoreCase("0"); 
    invalidateSelf(); 
} 


private Drawable.Callback callback = new Callback() { 
    @Override 
    public void invalidateDrawable(Drawable who) { 
     Log.d(Constants.TAG, "invalidateDrawable - BadgeDrawable: "); 
    } 

    @Override 
    public void scheduleDrawable(Drawable who, Runnable what, long when) { 

    } 

    @Override 
    public void unscheduleDrawable(Drawable who, Runnable what) { 

    } 
}; 

@Override 
public void setAlpha(int alpha) { 
    // do nothing 
} 

@Override 
public void setColorFilter(ColorFilter cf) { 
    // do nothing 
} 

@Override 
public int getOpacity() { 
    return PixelFormat.UNKNOWN; 
} 

}

私は、サーバーからの未読通知の数を取得する場合だから私はこのように設定します。

public static void setBadgeCount(Context context, LayerDrawable icon, String count) { 

    BadgeDrawable badge; // Reuse drawable if possible 
    Drawable reuse = icon.findDrawableByLayerId(R.id.ic_badge); //getting the layer 2 
    if (reuse != null && reuse instanceof BadgeDrawable) { 
     badge = (BadgeDrawable) reuse; 
    } else { 
     badge = new BadgeDrawable(context); 
    } 
    badge.setCount(count); 
    icon.mutate(); 
    icon.setDrawableByLayerId(R.id.ic_badge, badge); 
} 
+0

ドロアブルの境界を設定しようとしましたが、これで問題は解決しますか? –

+0

@Gil Moshayof私はそれに感謝しています。私はコンストラクタでこれを行う必要がありますか? – DJphy

+0

これは依存しています - 測定が行われるまでdrawableの境界が何であるかわからないときはほとんどの場合、境界が設定されていることを確認する必要があります。境界の幅または高さが0の場合、メソッドは呼び出されません。 –

答えて

0

drawableの境界が0より大きい幅と高さを生成することを確認してください。drawableの境界の幅または高さが0の場合、drawメソッドは呼び出されません。

ドロウアブル自体のsetBounds()を呼び出すことによって、ドロウアブルの境界を設定できます。

EDIT

自体を再描画する描画可能を取得するための別の方法は、レベルのメカニズムを使用することです。これはアニメーション化されたドロアブルには適していますが、関係なく使用できます。

あなたは呼び出すことで描画可能のリフレッシュをトリガすることができます:あなたは、あなたの描画可能なレベルの変化に再描画したい場合、あなたは以下のメソッドをオーバーライドしてtrueを返す必要があり、

setLevel(getLevel() + 1) 

を加えて:

@Override 
protected boolean onLevelChange(int level) { 
    return true; 
} 

「カウント」変数の代わりにレベルを使用することも考えられます。レベルが変更されていない場合は再描画されません。

これが役に立ちます。

+0

でも、私は境界を明示的に(setBounds()を呼び出す)コンストラクタを設定しても、それはまだonDraw()呼び出しをしませんでした。 invalidateを呼び出す前に、私が設定した値を表示していた境界をチェックしましたが、まだonDraw()を呼び出していませんでした。再び疑わしい:) – DJphy

+0

drawableでinvalidateSelf()を呼び出すことを避けてください。代わりに、drawableを保持するビューでpostInvalidateを呼び出します。 –

+0

私はここで何の意見も持っていません(私はドロウアブルだけを扱っています)。私はちょうどmenuitemからアイコンを取得します:Drawable drw = menuItem.getIcon();私はこのアイコンを操作する。私はこのドロアブルをビューとして扱うことはできません。 – DJphy

関連する問題