2012-03-13 6 views
10

나는 SeekBar를 더 부드럽게 움직이려고 노력하고있다. 저는 슬라이더 타입 구현을위한 3 가지 옵션이있는 SeekBar를 얻었으므로 이것을 수행합니다.Android 탐색 바를 원활하게 움직이게하려면 어떻게해야합니까?

"Yes", "No option", "No"의 세 가지 옵션으로 멋진 부드러운 슬라이더를 만들려고합니다. 앱의 기능과 SeekBar가 가장 쉽고 간단합니다.

나는 안드로이드 애니메이션을보고 시도하고 사람 :

답변

5

내 자신의 컨트롤을 내장 좋을 텐데 어떤 도움이 될 수 있다면 그래서, 조금 비트 복잡한 것 같습니다. 작업 완료 :) 코드 here

+1

+1 앞으로 방문자를 도울 수 있도록 소스 코드를 추가 할 수 있습니다. –

+0

신청서의 최신판을 게시하자마자 게시하겠습니다. 어쨌든 앱의 오픈 소스라고 생각합니다. –

+3

약속대로 - https://github.com/kennydude/Speaker/blob/master/src/me/kennydude/speaker/SmoothSeekBar.java 해당 위치가 코드 업데이트로 업데이트됩니다. –

11

검색 범위를 부드럽게 움직이면서도 제한된 범위의 값으로 스냅하려면 다음 해결책을 찾았습니다.

<SeekBar 
    android:id="@+id/sldProgress" 
    style="@style/MySliderStyle" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:max="100" 
    android:progress="50" /> 

<TextView 
    android:id="@+id/lblProgress" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:text="5" /> 

당신이 (당신의 활동에 다음 코드를 사용하여 안드로이드의 값을 변경할 수 있습니다 : 당신이 당신의 레이아웃 다음보기가 가정에 따라 아래의 코드에서 위의 XML에서 최대, 그리고 부드러움 계수를 당신의 요구 - 높은 값 = 부드러운가) :

public class MyActivity extends Activity { 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    sliderListener sldListener = new sliderListener(); 
    SeekBar sldProgress = (SeekBar) findViewById(R.id.sldProgress); 
    sldProgress.setOnSeekBarChangeListener(sldListener); 
    } 
    private class sliderListener implements OnSeekBarChangeListener { 
    private int smoothnessFactor = 10; 
    public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { 
     progress = Math.round(progress/smoothnessFactor); 
     TextView lblProgress = (TextView) findViewById(R.id.lblProgress); 
     lblProgress.setText(String.valueOf(progress)); 
    } 

    public void onStartTrackingTouch(SeekBar seekBar) { 
    } 

    public void onStopTrackingTouch(SeekBar seekBar) { 
     seekBar.setProgress(Math.round((seekBar.getProgress() + (smoothnessFactor/2))/smoothnessFactor) * smoothnessFactor); 
    } 
    } 
} 
+4

누가 이것을 downvoted 누구, 대답에 잘못이 무엇인지 설명하십시오 - 잊지, downvoting은 극단적 인 경우에만 노력에 답변을 갔다거나 대답은 위험한 경우에만 사용하기위한 것입니다. 대답이 위험하다면 이유를 알고 싶습니다! 고맙습니다. – Russ

+0

Integer.parseInt (String.valueOf (Math.round (progress/smoothnessFactor)))); 이것은 옳지 않은 것처럼 보입니다. progress/smoothnessFactor는 항상 int를 반환하므로 둘레를 둘 필요가 없습니다. 그런 다음 문자열로 변환 한 다음 int로 다시 변환합니다. – theelfismike

+4

그게 전부입니까? 귀하의 응용 프로그램을 날려 버릴 건가요? 불필요한 전환을 제거하기 위해 코드를 편집했습니다 (누구나 할 수 있었으므로 투표 할 필요가 없습니다). – Russ

1

당신은 그것을 위해 일을 할 것입니다 스스로 단지 사용자가 안드로이드 애니메이션 아무것도 구축 할 필요가 없습니다 당신

kotlion

에 writen 코드
mySeekbar.setOnSeekBarChangeListener(object : SeekBar.OnSeekBarChangeListener { 
     override fun onProgressChanged(seekBar: SeekBar, progress: Int, fromUser: Boolean) { 
      //Todo: code 
     } 

     override fun onStartTrackingTouch(seekBar: SeekBar?) { 
     } 

     override fun onStopTrackingTouch(seekBar: SeekBar) { 
      if (seekBar.progress > 70) { 
       ObjectAnimator.ofInt(seekBar, "progress", 100).setDuration(100).start() 
      } else if (seekBar.progress < 30) { 
       ObjectAnimator.ofInt(seekBar, "progress", 0).setDuration(100).start() 
      } else { 
       ObjectAnimator.ofInt(seekBar, "progress", 50).setDuration(100).start() 
      } 
     } 
    }) 
관련 문제