android - 可绘制的draw()调用不在不同设备上同时执行

标签 android android-canvas android-drawable

我的操作栏有一个自定义可绘制对象,它扩展了 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/

相关文章:

android - 在 Android Canvas 上绘制空心圆

android - 在 Android 中绘图使用什么 - View 或 SurfaceView?

android - 自定义按钮可绘制角在 2.3.3 和 4.0 中左下角、右下角不同(4.0 显示在右侧)

Android 从 XML 中的级别列表中选择可绘制对象

Android:随机更新自定义 ListView 的可能解决方案

android - 使用共享元素从非 Activity 类到 Activity 类的转换

Android:带有持续可见滚动条的Fingerpaint

android - 通过 Youtube 应用将视频转换到 ChromeCast

android - 当我在谷歌播放控制台中更新应用程序时,如何设置更新类型 "In App Update"?

java - 如何在 android 中定位 passwordToggleDrawable?