2016-05-29 7 views
0

Я пробовал все возможное, доступное онлайн, но этот метод не вызывается последовательно. Метод onDraw() иногда называют, а иногда просто игнорируется: Пожалуйста, пожалуйста, помогите мне, любая помощь приветствуется; BadgeDrawable класс: (хочу нарисовать знак на мой значок уведомления в панели действий)Метод OnDraw() класса Drawable не набирается

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

Это зависит - в большинстве случаев, когда вы не знаете, каковы границы вашей цели, до тех пор, пока не произойдет какое-либо измерение, вам просто нужно убедиться, что границы установлены, так как если ширина или высота границ равны 0, метод не будет вызван. –

ответ

0

Убедитесь, что границы выдвигаемого объекта имеют ширину и высоту, превышающую 0. Если ширина или высота границы линии, равная 0, не будет вызываться, то метод draw не будет вызываться.

Вы можете установить границы вытягиваемого вызова, вызвав setBounds() на само по себе.

EDIT

Другой способ получить растяжимой перерисовать себя является использование механизма уровня. Это полезно для чертежей, которые оживляют, но могут использоваться независимо.

Вы можете запустить обновление в Drawable по телефону:

setLevel(getLevel() + 1) 

Кроме того, если вы хотите, чтобы ваша вытяжку перерисовывать на изменении уровня, необходимо переопределить следующий метод и возвращает истину:

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

Возможно, вы даже можете подумать об использовании уровня вместо переменной count, поскольку перерисовка не будет активирована, если уровень не изменится.

Надеюсь, это поможет.

+0

Даже если я задал границы явно (callling setBounds()) в конструкторе, он все равно не вызывал onDraw(); перед вызовом invalidate я проверил границы, на которых показывались значения, которые я установил, но все равно не вызывал onDraw(); снова подозрительно :) – DJphy

+0

избегать вызова invalidateSelf() на drawable. Вместо этого вызовите postInvalidate в представлении, которое содержит drawable. –

+0

У меня нет никаких просмотров (я имею дело только с чертежами); я просто извлекаю значок из menuitem, например: Drawable drw = menuItem.getIcon(); Я манипулирую этим значком. Я не могу рассматривать это применимое как представление; – DJphy

Смежные вопросы