Drawable draw()调用不会在各种设备上同时执行

时间:2012-12-06 15:47:07

标签: android android-canvas android-drawable

我的操作栏有一个自定义drawable,扩展了GradientDrawable。我的drawable本身正是我想要的,我的问题似乎是它绘制的时候。我是在Nexus设备上开发的,它运行得很好,完全符合预期,但是,当我在非nexus设备上运行时,它无法正常运行。我追溯到draw(Canvas canvas)来电未被调用与Nexus设备相同的速率。我添加了一行代码,在调整其设置后用相同的drawable替换了可绘制的动作栏,这使得它可以在所有设备上运行,但是我不喜欢在用户拖动屏幕时不断重置drawable。这根本不是一个问题吗?制造商是否真的要修改绘图系统呢?有任何想法吗?设备结果和代码包含在下面。

drawable的draw()方法

/*
* mUnderlineColor, mUnderlineWidth, mToplineColor and mToplineWidth are all
* parameters which change as the user drags. The methods to set them call
* invalidateSelf() after changing the values in the corresponding paints
*/
public void draw(Canvas canvas) {
        super.draw(canvas);
        if (Color.alpha(mUnderlineColor) != 0) {
            canvas.drawLine(0, canvas.getHeight()-mUnderlineWidth+1, canvas.getWidth(), 
                    canvas.getHeight()-mUnderlineWidth+1, mUnderlinePaint);
        }
        canvas.drawLine(0, mToplineWidth-1, canvas.getWidth(), mToplineWidth-1, mToplinePaint);
    }

public void setUnderlineAlpha(float alpha) {
    mUnderlineColor = Color.argb(Math.round(alpha * 255), Color.red(mUnderlineColor),
            Color.green(mUnderlineColor), Color.blue(mUnderlineColor));
    mUnderlinePaint.setColor(mUnderlineColor);
    invalidateSelf();
}

设置参数

public void onPageScroll(int xpos) {
        float alpha = mWidthPercentage - (float)xpos / mScreenWidthPixels;
        mFadingUnderline = alpha / mWidthPercentage;
        int actionBarAlpha = 200 + Math.round((255 - 200) * mFadingUnderline);
        mDrawable.setAlpha(actionBarAlpha);
        mDrawable.setUnderlineAlpha(mFadingUnderline);
        //mActionBar.setBackgroundDrawable(mDrawable);
            //The commented line is unnecessary on Nexus devices, but required on
            //everything else.
}

不需要我致电setBackgroundDrawable() *

的设备
  • Galaxy Nexus(4.2.1)
  • Nexus 10(4.2.1)
  • Nexus 7(4.2.1)
  • Nexus S(4.2)
  • Motorola Xoom(4.0.4)

要求我致电setBackgroundDrawable() *

的设备
  • Transformer Prime(4.1.1)
  • Galaxy Tab 7.0+(4.0.4)
  • Acer A500(4.0.3)

如果没有重置drawable的开销,我不介意这么多,我觉得Nexus设备都在invalidateSelf()之后绘制并且制造商设备没有。有人有一些意见吗?

1 个答案:

答案 0 :(得分:3)

如果设置了Drawable的回调,

invalidateSelf()仅执行重绘。我想象在成功的设备上getCallback()将是非空的,并且在失败时它将为空。为什么?你找到了我。

setBackgroundDrawable()的新调用有效的原因是导致ActionBar无效。您可以绕过并手动使ActionBar无效,而不是刷新。不要认为这太重要了。