我的操作栏有一个自定义可绘制对象,它扩展了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() 之后绘制而制造商设备没有绘制,这对我来说似乎很奇怪。有人有意见吗?