拡張するアクションバー用のカスタムドローアブルがあります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()
*
- ギャラクシー ネクサス (4.2.1)
- ネクサス 10 (4.2.1)
- ネクサス 7 (4.2.1)
- ネクサス S (4.2)
- モトローラ Xoom (4.0.4)
電話をかける必要があるデバイスsetBackgroundDrawable()
*
- トランスフォーマープライム (4.1.1)
- ギャラクシー タブ 7.0+ (4.0.4)
- エイサー A500 (4.0.3)
あまり気にしないドローアブルをリセットするオーバーヘッドがない場合、Nexus デバイスがすべて invalidateSelf() の後に描画し、製造元のデバイスが描画しないのは奇妙に思えます。誰でも入力がありますか?