Android SeekBar、進捗状況を動的に表示し、SeekBarとともに移動

5147 ワード

https://www.jianshu.com/p/46242fde8cee
問題:スライドする時だけ、数字はスライドして、初期化の数字の位置を設定する時、変化していません.seekbarのためです.getWith()はずっと0で、何が原因なのか、主な原因はoncrate()の時、コントロールがまだ初期化されておらず、手に入れた大きさも幅も0なので、他の場所で幅を高くするべきで、解決方法https://mp.csdn.net/postedit/83106769
package com.xq.customview;

import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.util.Log;
import android.widget.SeekBar;
import android.widget.TextView;
/**
 */
public class ThreeActivity extends Activity {
    private int startTimeStr = 50;
    private int endTimeStr =100;
    private TextView textView;
    private SeekBar seekBar ;
    /**
     *   
     */
    private int totalSeconds = 0;
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.seekbar_layout);
          textView = findViewById(R.id.seek_text);
        //seekbar
         seekBar = findViewById(R.id.seekBar);
        totalSeconds = endTimeStr - startTimeStr;
        seekBar.setProgress(50);
        textView.setText(check(50));
        seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
            @Override
            public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {

                //    -50~50 ,  seekbar.getmin()   ,     0~100 -50;
                int text = progress ;
                //      
                textView.setText(check(progress));
                Log.d("=====ssss",text+"");
                //      
                float textWidth = textView.getWidth();

                //  seekbar    x  
                float left = seekBar.getLeft();

                //       
                float max =Math.abs(seekBar.getMax());

                //   thumb   , seekbar     ,     ,seekbar      ,         ,  xml    paddingStart   paddingEnd           ,     15dp;
                float thumb = dip2px(ThreeActivity.this,15);

                //   1   ,text        = (seekBar    -       ) /   progress  
                float average = (((float) seekBar.getWidth())-2*thumb)/max;
                //int to float
                float currentProgress = progress;
                //textview         = seekbar    + seekbar       +   progress       - textview     (      )
                float pox = left - textWidth/2 +thumb + average * currentProgress;
                textView.setX(pox);
            }
            @Override
            public void onStartTrackingTouch(SeekBar seekBar) {

            }

            @Override
            public void onStopTrackingTouch(SeekBar seekBar) {

            }
        });
    }
    public  int dip2px(Context context, float dpValue) {
        final float scale = context.getResources().getDisplayMetrics().density;
        return (int) (dpValue * scale + 0.5f);
    }
    private String check(int progress) {
        int curValue = totalSeconds * progress/Math.abs(endTimeStr);
        curValue = curValue + startTimeStr;
        Log.e("check", totalSeconds+","+curValue+","+ seekBar.getMax()+"progress"+progress);
        return String.valueOf(curValue);
    }
}

次はseekbar_layout.xmlコード



    
        
        
    


次は進捗バーのスタイルpo_seekbar.xml、スタイルを変える必要がある場合はこれが必要です