ここで私の最初の質問 ( Android: Change center of linear GradientDrawable via code ) を参照すると、背景のグラデーションの中心を変更しようとしてまだ苦労しています。
基本的に、システムのボリュームに応じて、背景の線形グラデーションの中心を変更したいと考えています。したがって、ユーザーがボリュームを変更すると、グラデーションは (#1) 再描画されるか、(#2) 位置が変更されます。
#1: シェーダー ファクトリを使用した線形グラデーションの回避策があります。
ShapeDrawable.ShaderFactory sf=new ShapeDrawable.ShaderFactory() {
@Override
public Shader resize(int width, int height) {
return new LinearGradient(0, 0, width, height,
new int[]{Color.WHITE, Color.GRAY, Color.BLACK},
new float[]{0,0.5f,1}, Shader.TileMode.MIRROR);
}
};
しかし、このソリューションの問題は、いくつかの異なるグラデーションモードがあり、ボリュームが変わるたびに背景が変更され、再描画されることです...ストリーミングアプリケーションなので、この場合のパフォーマンスについてはわかりません
だから私は解決策#2に来ました。すべての線形グラデーションが選択されている場合は一度描画し、たとえばデバイスの画面よりも大きいビューで描画します。
ここで、ユーザーが音量を変更すると、画面は Y 軸上を移動します。しかし、線形グラデーションとシェーダー ファクトリでも試してみましたが、Background-View-Gradient は常に画面デバイスと同じ大きさであり、大きくはありません。
Display display = getWindowManager().getDefaultDisplay();
Point size = new Point();
display.getSize(size);
int width = size.x;
int height = size.y + 500; //change height to higher than parentview
//get a background and change layout (tried with view,relativelayout as well)
LinearLayout backgroundGradientView = (LinearLayout)
findViewById(R.id.player_backgroundGradient);
backgroundGradientView.getLayoutParams().width = width;
backgroundGradientView.getLayoutParams().height = height;
GradientDrawable gd = new GradientDrawable(
GradientDrawable.Orientation.TOP_BOTTOM, new int[] { startColor, endColor });
backgroundGradientView.setBackground(gd);
//later, i m changing the Y Value, but the background is as big as the parent
backgroundGradientView.setY(currentY + 100)
これを変更する方法はありますか?私は本当にこのケースを解決する方法を知りません?!