EntryNavi : « Androidで円形のプログレスバーを作ってみた | メイン | Androidで通知領域にメッセージを表示する »

CategoryNavi : メイン -> コンピューター -> 開発 -> Java(Android)

「HorizontalScrollView」拡張して自動でスクロールするようにしてみた

Androidで横方向にスクロールしてテキストなどを表示したい時に使用する「HorizontalScrollView」があります。
これを拡張して自動で左右に行ったり来たりする「HorizontalAutoScrollView」を作ってみました。

ただ、Animationクラスとか使わないで無理やりスクロールさせてるので動きが若干ギコチないのと電池消耗するかもねって事です。
スクリーンショットは、解りにくいので割愛w

機能としては、以下の項目を調節できるようにしました。
・フレーム間隔(msec)
・フレーム間の移動量(px)
・折り返しの時の停止時間(msec)


XML
<jp.xii.relog.customlibrary.HorizontalAutoScrollView
	    android:layout_width="fill_parent" 
	    android:layout_height="wrap_content"
	    android:scrollbars="none"
	    frameInterval="60"
	    frameDelta="2"
	    lapelInterval="1000"
		>
    <TextView 
	    android:id="@+id/Sample_Text"  
	    android:layout_width="wrap_content" 
	    android:layout_height="wrap_content"
	    android:scrollHorizontally="true"
	    android:textSize="20dip"
	    android:textColor="#FFFFFFFF"
	    android:text="-"
	    />
</jp.xii.relog.customlibrary.HorizontalAutoScrollView>

メインクラス
package jp.xii.relog.customlibrary;

import android.content.Context;
import android.os.Handler;
import android.util.AttributeSet;
import android.view.View;
import android.widget.HorizontalScrollView;

public class HorizontalAutoScrollView extends HorizontalScrollView {

	private final static String STR_ATTR_FRAME_INTERVAL = "frameInterval";	//フレーム間の時間
	private final static String STR_ATTR_FRAME_DELTA = "frameDelta";		//フレーム間の移動量
	private final static String STR_ATTR_LAPEL_INTERVAL = "lapelInterval";	//折り返す時のフレーム間隔

	private Handler _handlerAnimation = null;		//アニメーション用
	private int _frameInterval = 100;				//フレーム間の時間
	private int _frameDelta = 2;					//フレーム間の移動量
	private int _lapelInterval = 500;				//折り返す時のフレーム間隔
	private boolean _isDerectionLeft = true;		//左へ動いているか
	private int _prev_x = 0;						//前回の場所
	
	/**
	 * 描画スレッド
	 */
	private final Runnable _runAnimationThread = new Runnable(){
		public void run(){

			updateAutoScroll();
			
		}
	};

	
	/**
	 * アニメーション用のハンドラ
	 * @return
	 */
	private Handler getHandlerAnimation(){
		if(_handlerAnimation == null){
			_handlerAnimation = new Handler();
		}
		return _handlerAnimation;
	}
	
	/**
	 * 横スクロールするテキストビューのコンストラクタ
	 * @param context
	 * @param attrs
	 */
	public HorizontalAutoScrollView(Context context, AttributeSet attrs) {
		super(context, attrs);
		
		String temp = null;
		
		//フレーム間の時間
		temp = attrs.getAttributeValue(null, STR_ATTR_FRAME_INTERVAL);
		if(temp != null){
			_frameInterval = Integer.valueOf(temp);
		}
		//フレーム間の移動量
		temp = attrs.getAttributeValue(null, STR_ATTR_FRAME_DELTA);
		if(temp != null){
			_frameDelta = Integer.valueOf(temp);
		}
		//折り返し時のフレーム間隔
		temp = attrs.getAttributeValue(null, STR_ATTR_LAPEL_INTERVAL);
		if(temp != null){
			_lapelInterval = Integer.valueOf(temp);
		}
		
	}

	/**
	 * 表示状態が変わった
	 */
	@Override
	protected void onWindowVisibilityChanged(int visibility) {
		super.onWindowVisibilityChanged(visibility);
		
		if(visibility == View.VISIBLE){
			startAutoScroll();
		}else{
			stopAutoScroll();
		}
	}

	/**
	 * 自動スクロールを開始する
	 */
	public void startAutoScroll(){
		//監視を開始
		getHandlerAnimation().postDelayed(_runAnimationThread, _frameInterval);
	}
	
	/**
	 * 自動スクロールを止める
	 */
	public void stopAutoScroll(){
		//停止する
		getHandlerAnimation().removeCallbacks(_runAnimationThread);
		//位置を戻す
		scrollTo(0, getScrollY());
	}

	/**
	 * 自動スクロールの状態更新
	 */
	public void updateAutoScroll(){
		int next_interval = _frameInterval;
		int x = getScrollX();
		
		if(getChildAt(0) == null){
		}else if(getChildAt(0).getWidth() <= getWidth()){
			//はみ出てない
			next_interval *= 2;	//スクロールの必要が無いので間隔を広げる
			
			_isDerectionLeft = true;
			_prev_x = 0;
			x = 0;
			
		}else{
			//はみ出てる

			//位置を計算
			if(_isDerectionLeft){
				//左へ
				x += _frameDelta;
			}else{
				//右へ
				x -= _frameDelta;
			}
			//向きを変える
			if(x == _prev_x){
				_isDerectionLeft = !_isDerectionLeft;
				next_interval = _lapelInterval;
			}
			_prev_x = x;
			
		}

		//移動
		scrollTo(x, getScrollY());

		//次のセット
		getHandlerAnimation().postDelayed(_runAnimationThread, next_interval);
	}
	
}
<Category : Java(Android)>

検索

Google

サイドフィード

track feed 理ろぐ
人気ブログランキング - 理ろぐ
Powered by
Movable Type 3.34