2

拡張するアクションバー用のカスタムドローアブルがあります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() の後に描画し、製造元のデバイスが描画しないのは奇妙に思えます。誰でも入力がありますか?

4

1 に答える 1

3

invalidateSelf()Drawable のコールバックが設定されている場合にのみ再描画を実行します。成功したデバイスでは agetCallback()が非 null になり、失敗した場合は null になると思います。なんで?まいったよ。

新しい呼び出しがsetBackgroundDrawable()機能する理由は、ActionBarそれ自体が無効になるためです。ActionBar更新する代わりに、バイパスして手動で無効にすることができます。あまり重要だと思わないでください。

于 2012-12-06T16:00:43.570 に答える