Способ изменить цвет прогресса пользовательской вертикальной панели поиска на Android, не работает из потока - PullRequest
0 голосов
/ 07 октября 2011

Я пытаюсь изменить цвет выполнения пользовательского вертикального SeekBar Как получить рабочий вертикальный SeekBar в Android? , и он работает нормально, если я помещаю этот код в View.OnTouchListener:

VerticalSeekBar verticalSeekBar1 = (VerticalSeekBar)verticalSeekBar;
Rect bounds = verticalSeekBar1.getProgressDrawable().getBounds();
int progr = verticalSeekBar1.getProgress();
int max = verticalSeekBar1.getMax();
int width = verticalSeekBar1.getWidth(); 
int height = verticalSeekBar1.getHeight();
prDr = verticalSeekBar1.getProgressDrawable();
verticalSeekBar1.setProgressDrawable(r.getDrawable(R.drawable.myprogress));
verticalSeekBar1.getProgressDrawable().setBounds(bounds);
verticalSeekBar1.setMax(max);
verticalSeekBar1.setProgress(1);
verticalSeekBar1.setProgress(progr);
verticalSeekBar1.onSizeChanged(width, height);
verticalSeekBar1.refreshDrawableState();

Однако, если я помещаю этот же код в другой поток, он работает частично, так как большой палец панели поиска не перемещается в правильное положение и вместо этого падает, но цвет прогресса работает хорошо и добирается допоследняя позиция.Я понял, что метод onSizeChanged, вероятно, вызывает это.Я отладил его и обнаружил, что в обоих сценариях метод onSizeChanged имеет соответствующие аргументы, но в коде из потока он не обновляет панель поиска.

Я уже пытался переместить этот код в поток пользовательского интерфейса, но не работаетлибо.

Ответы [ 2 ]

2 голосов
/ 16 марта 2012
    LinearLayout linearLayout = new LinearLayout(getApplicationContext());

    LinearLayout.LayoutParams rlp = new LinearLayout.LayoutParams(
            LinearLayout.LayoutParams.WRAP_CONTENT,
            LinearLayout.LayoutParams.FILL_PARENT);

    // linearLayout.setOrientation(LinearLayout.VERTICAL);

    VerticalSeekBar_1 verticalSeekBar_1 = new VerticalSeekBar_1(
            getApplicationContext());

    // ------------ custom seekbar
     LayerDrawable layer = (LayerDrawable) verticalSeekBar_1
     .getProgressDrawable();

     Drawable draw1 = (Drawable) layer
     .findDrawableByLayerId(android.R.id.progress);

     Bitmap bitmap1 = BitmapFactory.decodeResource(getApplicationContext()
     .getResources(), R.drawable.scroll_on);

     draw1 = new ClipDrawable(new BitmapDrawable(bitmap1),
     Gravity.AXIS_PULL_BEFORE, ClipDrawable.HORIZONTAL);

     layer.setDrawableByLayerId(android.R.id.progress, draw1);

     Drawable draw2 = (Drawable) layer
     .findDrawableByLayerId(android.R.id.background);

     Bitmap bitmap2 = BitmapFactory.decodeResource(getApplicationContext()
     .getResources(), R.drawable.scroll_off);

     draw2 = new BitmapDrawable(bitmap2);
     layer.setDrawableByLayerId(android.R.id.background, draw2);

    // --------------



    verticalSeekBar_1.setLayoutParams(rlp);

    verticalSeekBar_1.setMax(100);
    verticalSeekBar_1.setProgress(30);
    verticalSeekBar_1
            .setOnSeekBarChangeListener(new OnSeekBarChangeListener() {

                @Override
                public void onProgressChanged(SeekBar seekBar,
                        int progress, boolean fromUser) {
                    // TODO Auto-generated method stub

                }

                @Override
                public void onStartTrackingTouch(SeekBar seekBar) {
                    // TODO Auto-generated method stub

                }

                @Override
                public void onStopTrackingTouch(SeekBar seekBar) {
                    // TODO Auto-generated method stub

                }
            });

    linearLayout.addView(verticalSeekBar_1);
    setContentView(linearLayout);
0 голосов
/ 10 октября 2011

Я читал, что с помощью Handler или AsyncTask можно выполнить работу по обновлению пользовательского интерфейса, и это помогло.

uiHandler.post(new Runnable() {
                VerticalSeekBar vs;
                Rect bounds;
                int progr;
                int max;
                int width;
                int height;
                 {
                    vs = verticalSeekBars.get(currentNote);
                    bounds = vs.getProgressDrawable().getBounds();
                    progr = vs.getProgress();
                    max = vs.getMax();
                    width = vs.getWidth(); 
                    height = vs.getHeight();
                }

                public void run() {
                    if(currentBytes != 0) {
                        VerticalSeekBar vsBack = verticalSeekBars.get(currentNote-1);
                        Rect bounds = vsBack.getProgressDrawable().getBounds();
                        int progr = vsBack.getProgress();
                        int max = vsBack.getMax();
                        int width = vsBack.getWidth(); 
                        int height = vsBack.getHeight();
                        vsBack.setProgressDrawable(prDrInactive);
                        vsBack.getProgressDrawable().setBounds(bounds);
                        vsBack.setMax(max);
                        vsBack.setProgress(1);
                        vsBack.setProgress(progr);
                        vsBack.onSizeChanged(width, height);
                        vsBack.refreshDrawableState();
                    }

заметка.

                    prDrInactive = vs.getProgressDrawable();

                    vs.setProgressDrawable(prDrActive);
                    vs.getProgressDrawable().setBounds(bounds);
                    vs.setMax(max);
                    vs.setProgress(1);
                    vs.setProgress(progr);
                    vs.onSizeChanged(width, height);
                    vs.refreshDrawableState();
                }
            });
...