2

我的操作栏有一个自定义可绘制对象,它扩展了GradientDrawable. 我drawable本身绘制的正是我想要的,我的问题似乎是它何时绘制。我在 Nexus 设备上开发它,它运行良好,完全符合预期,但是,当我在非 Nexus 设备上运行它时,它无法正常运行。我将其追溯到draw(Canvas canvas)呼叫的呼叫速度与 Nexus 设备的呼叫速度不同。我添加了一行代码,在调整其设置后用相同的可绘制对象替换操作栏可绘制对象,这使其在所有设备上都可以使用,但我不喜欢在用户拖动屏幕时不断重置可绘制对象。这根本不是问题吗?制造商真的可以对绘图系统进行那么多修改吗?有任何想法吗?设备结果和代码如下所示。

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()*

  • 银河连结 (4.2.1)
  • 连结 10 (4.2.1)
  • 连结 7 (4.2.1)
  • 连结 S (4.2)
  • 摩托罗拉 Xoom (4.0.4)

需要我打电话的设备setBackgroundDrawable()*

  • 变压器 Prime (4.1.1)
  • Galaxy Tab 7.0+ (4.0.4)
  • 宏碁 A500 (4.0.3)

如果没有重置可绘制对象的开销,我不太介意,对我来说,Nexus 设备都在 invalidateSelf() 之后绘制而制造商设备没有绘制,这对我来说似乎很奇怪。有人有意见吗?

4

1 回答 1

3

invalidateSelf()仅当设置了 Drawable 的回调时才执行重绘。我想在成功的设备上 agetCallback()将是非空的,而在失败时它将是空的。为什么?你得到了我。

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

于 2012-12-06T16:00:43.570 回答