我的操作栏有一个自定义可绘制对象,它扩展了 GradientDrawable
。我的可绘制对象本身完全绘制了我想要的内容,我的问题似乎是它绘制的时间。我在 Nexus 设备上开发了它,它运行得很好,完全符合预期,但是,当我在非 Nexus 设备上运行它时,它无法正常运行。我追踪到 draw(Canvas canvas)
调用的调用速率与 Nexus 设备的调用速率不同。我添加了一行代码,在调整其设置后用相同的可绘制对象替换操作栏可绘制对象,这使得它可以在所有设备上工作,但我不喜欢不断地重置可绘制对象,因为它是在用户在屏幕上拖动时发生的。难道这根本就不是一个问题吗?制造商真的可以对绘图系统进行如此大的修改吗?有任何想法吗?下面包含设备结果和代码。
可绘制对象的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)
- 摩托罗拉 Xoom (4.0.4)
确实需要我调用 setBackgroundDrawable()
*
- 变形金刚 Prime (4.1.1)
- Galaxy Tab 7.0+ (4.0.4)
- 宏碁 A500 (4.0.3)
如果没有重置可绘制对象的开销,我不太介意,但对我来说,Nexus 设备都在 invalidateSelf() 之后绘制而制造商设备不绘制,这对我来说似乎很奇怪。有人有意见吗?
最佳答案
invalidateSelf()
仅在设置了 Drawable 的回调时才执行重绘。我想在成功的设备上,getCallback()
将是非空的,失败时它将是空的。为什么?你捕获了我。
对 setBackgroundDrawable()
的新调用起作用的原因是,这会导致 ActionBar
自身失效。您可以绕过并手动让 ActionBar
失效,而不是刷新。不要认为这太重要。
关于android - 可绘制的draw()调用不在不同设备上同时执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13747288/