我的操作栏有一个自定义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()
*
要求我致电setBackgroundDrawable()
*
如果没有重置drawable的开销,我不介意这么多,我觉得Nexus设备都在invalidateSelf()之后绘制并且制造商设备没有。有人有一些意见吗?
答案 0 :(得分:3)
invalidateSelf()
仅执行重绘。我想象在成功的设备上getCallback()
将是非空的,并且在失败时它将为空。为什么?你找到了我。
对setBackgroundDrawable()
的新调用有效的原因是导致ActionBar
无效。您可以绕过并手动使ActionBar
无效,而不是刷新。不要认为这太重要了。