-1

ここで私の最初の質問 ( 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) 

これを変更する方法はありますか?私は本当にこのケースを解決する方法を知りません?!

4

1 に答える 1

0

OK、うまくいきました。最終的に Shader Factory ソリューションを使用しました。毎回グラデーションを再描画するパフォーマンスが最高かどうかはわかりませんが、少なくとも機能しています.. Androidデバイスの音量に応じて背景のグラデーションを変更しています:

//global variables, because they can change during runtime
private int startColor;
private int endColor;
private float gradientCenter;


// call this, after every volume change, gradientCenter is a value between 0.0-0.5f, depending on the current volume 
//...
AudioManager audMgr = (AudioManager) context
        .getSystemService(Context.AUDIO_SERVICE);
int currentVolume = audMgr.getStreamVolume(AudioManager.STREAM_MUSIC);
int maxVolume = audMgr.getStreamMaxVolume(AudioManager.STREAM_MUSIC);
gradientCenter = 0.5f - (float) currentVolume / (float) maxVolume
        * 0.5f; 
drawBackground();
//...



private void drawBackground() {
PaintDrawable p = new PaintDrawable();
p.setShape(new RectShape());
p.setShaderFactory(sf);
(YOUR_VIEW_FOR_BACKGROUND).setBackgroundDrawable(p);
}

//ShaderFactory is using the global gradientCenter,startColor and endColor
ShapeDrawable.ShaderFactory sf = new ShapeDrawable.ShaderFactory() {
@Override
public Shader resize(int width, int height) {
    return new LinearGradient(0, 0, 0, height, new int[] { startColor,
            endColor }, new float[] { gradientCenter, 1.0f },
            Shader.TileMode.CLAMP);
}
//...
于 2013-02-01T12:18:37.950 に答える