수요일, 7월 21, 2010

[Android] My Tip - SeekBar

My Android Tip
 - Use at your own risk! lol, ㅋㅋㅋ


내가 작업한 것 중에서 유용한 Tip 들을 정리 해본다.

// ---------------------------------------------
// :: SeekBar
// ---------------------------------------------
 - main.xml
android:layout_width="fill_parent"
android:layout_height="wrap_contents"
android:clickable="true"
android:paddingLeft="5px"
android:paddingRight="5px"
android:maxHeight="20px" // this means ProgressiveBar Height
android:max="1000"
android:progress="0"
android:fitsSystemWindows="true"
android:thumb="@drawable/seekbar_thumb"
android:progressDrawable="@drawable/seekbar"
android:secondaryProgress="0">

 - seekbar.xml: Change "(" to "<"
(layer-list xmlns:android="http://schemas.android.com/apk/res/android")
    (item android:id="@android:id/background")
     (clip android:drawable="@drawable/bg" /)
    (/item)
/*
    (item android:id="@android:id/secondaryProgress")
        (clip android:drawable="@drawable/progress2" /)
(/item)
*/
    (item android:id="@android:id/progress")
(clip android:drawable="@drawable/progress" /)
(/item)
(/layer-list)

 - seekbar_thumb.xml: Change "(" to "<"
(selector xmlns:android="http://schemas.android.com/apk/res/android")
 (item android:state_pressed="true"
android:drawable="@drawable/thumb_button_pressed" /)
 (item android:state_focused="true"
android:drawable="@drawable/thumb_button_focused" /)
 (item android:state_focused="false"
android:drawable="@drawable/thumb_button_normal" /)
(/selector)


 - Thread:
Thread.sleep( 1000 );
if( m_MediaPlayer.isPlaying() == false )
break;
m_Handler.sendMessage( m_Handler.obtainMessage() );

 - SeekBar:
        // SeekBar
        m_SeekBar = (SeekBar)findViewById( R.id.SeekBar01 );
        m_SeekBar.setProgress( 0 );
        m_SeekBar.setClickable( true );

 - Handler:
m_Handler = new Handler() {
public void handleMessage(android.os.Message msg) {
if( (m_MediaPlayer == null) ) {
m_SeekBar.setProgress( 0 );

// something
// ...

return;
}

if( m_MediaPlayer.isPlaying() ) {
int position = m_MediaPlayer.getCurrentPosition();
int duration = m_MediaPlayer.getDuration();
if( m_SeekBar != null ) {
if( duration > 0 ) {
long pos = m_MediaPlayer.getDuration() * position / duration;
m_SeekBar.setProgress( m_MediaPlayer.getCurrentPosition() );
}

// something
// ...

// NOTE: below code are just sample...
// ...

int m = (int) Math.floor(m_MediaPlayer.getCurrentPosition()/(1000*60));
int s = (int) Math.floor((m_MediaPlayer.getCurrentPosition()-(1000*60)*m)/1000);
m_CurrentSec = (m * 60) + s;
String strM = m < 10 ? "0" + Integer.toString( m ) : Integer.toString( m );
String strS = s < 10 ? "0" + Integer.toString( s ) : Integer.toString( s );
m_strCurrentMS = strM + ":" + strS;

Log.d( "THREAD", "Cur = " + m_CurrentSec + ", Duration = " + m_DurationSec );
if( ((m_CurrentSec+1) >= m_DurationSec) || ((m_CurrentSec+1) >= m_DurationSec) ) {
Log.d( "THREAD", "THREAD END..." );

m_strCurrentMS = "00:00";
if( m_MediaPlayer != null ) {
m_MediaPlayer.release();
m_MediaPlayer = null;
}
m_SeekBar.setProgress( 0 ); // reset

// something
// ...
}
}
}
else {
Log.d( "THREAD", "Playing == false" );
m_strCurrentMS = "00:00";
if( m_MediaPlayer != null ) {
m_MediaPlayer.release();
m_MediaPlayer = null;
}

m_SeekBar.setProgress( 0 ); // reset

// something
// ...
}
};
};

m_SeekBar.setOnSeekBarChangeListener( new OnSeekBarChangeListener() {
public void onStopTrackingTouch(SeekBar seekBar) {
// TODO Auto-generated method stub

   if( m_MediaPlayer != null )
m_CurrentPosition = m_MediaPlayer.getCurrentPosition();
   else
       m_SeekBar.setProgress( 0 );
}
public void onStartTrackingTouch(SeekBar seekBar) {
// TODO Auto-generated method stub
}

public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
// TODO Auto-generated method stub
if( !fromUser )
return;

   if( m_MediaPlayer != null ) {
long duration = m_MediaPlayer.getDuration();
//long newposition = (duration * progress) / 1000L;
long newposition = (duration * progress) / m_MediaPlayer.getDuration();
m_MediaPlayer.seekTo( (int) newposition);
   }
}
}
);
// ---------------------------------------------



:: Disable SeekBar Touch Event
seekBar.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
//return false;
return true;
}
});



-----
Cheers,
June

댓글 없음:

댓글 쓰기