19
16

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

フリックイベント機能

Posted at

Androidで使用できるフリック機能の汎用プログラムです。

#フリック機能クラスのコード

FlickChack.class
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;

public abstract class FlickCheck {
	
	public static final int LEFT_FLICK= 0;
	public static final int RIGHT_FLICK = 1;
	public static final int UP_FLICK = 2;
	public static final int DOWN_FLICK = 3;
	
	private float adjustX = 150.0f;
	private float adjustY = 150.0f;
	private float touchX;
	private float touchY;
	private float nowTouchX;
	private float nowTouchY;
	
	/**
	 * frickViewにはフリックを検知させるViewをセット<br/>
	 * adjustXには左右のフリック距離目安、adjustYには上下のフリック距離目安をセット
	 * @param frickView
	 * @param adjustX
	 * @param adjustY
	 */
	public FlickCheck(View frickView, float adjustX, float adjustY){
		
		this.adjustX = adjustX;
		this.adjustY = adjustY;
		
		frickView.setOnTouchListener(new OnTouchListener() {
			
			@Override
			public boolean onTouch(View v, MotionEvent event) {
				switch (event.getAction()) {
			    case MotionEvent.ACTION_DOWN:
			    	touchX = event.getX();
			    	touchY = event.getY();
			        break;
			    case MotionEvent.ACTION_UP:
			    	nowTouchX = event.getX();
			    	nowTouchY = event.getY();
			    	check();
			    	v.performClick();
			        break;
			    case MotionEvent.ACTION_MOVE:
			        break;
			    case MotionEvent.ACTION_CANCEL:
			        break;
			    }
			    return true;
			}

		});
	}
	
	/**
	 * どの方向にフリックしたかチェック
	 */
	private void check(){
		Log.d("FlickPoint", "startX:" + touchX + " endX:" + nowTouchX
				+ " startY:" + touchY + " endY:" + nowTouchY);
		// 左フリック
    	if(touchX > nowTouchX)
    	{
    		if(touchX - nowTouchX > adjustX)
    		{
    			getFlick(LEFT_FLICK);
    			return;
    		}
    	}
    	// 右フリック
    	if(nowTouchX > touchX)
    	{
    		if(nowTouchX - touchX > adjustX)
    		{
    			getFlick(RIGHT_FLICK);
    			return;
    		}
    	}
    	// 上フリック
    	if(touchY > nowTouchY)
    	{
    		if(touchY - nowTouchY > adjustY)
    		{
    			getFlick(UP_FLICK);
    			return;
    		}
    	}
    	// 下フリック
    	if(nowTouchY > touchY)
    	{
    		if(nowTouchY - touchY > adjustY)
    		{
    			getFlick(DOWN_FLICK);
    			return;
    		}
    	}
	}
	
	/**
	 * 抽象メソッド:フリックを感知した際、方向を表す値をセットする
	 * @param swipe
	 */
	public abstract void getFlick(int swipe);

}

#使い方
上記クラスを作成したら、使用したいActivityでインスタンス化します。
・第一引数にはフリックイベントを実装するView(例はページ全体を設定)
・第二引数には横フリックを検知する距離(左右のフリック)
・第三引数には縦フリックを検知する距離(上下のフリック)

MainActivity
View flickView = getWindow().getDecorView(); // Activity画面
float adjustX = 150.0f;
float adjustY = 150.0f;

new FlickCheck(flickView, adjustX, adjustY) {
			
			@Override
			public void getFlick(int flickData) {
				switch (flickData) {
				case FlickCheck.LEFT_FLICK:
					// 左フリック
					break;
					
				case FlickCheck.RIGHT_FLICK:
					// 右フリック
					break;
									
				case FlickCheck.UP_FLICK:
					// 上フリック
					break;
					
				case FlickCheck.DOWN_FLICK:
					// 下フリック
					break;
				}
			}
		};

インスタンス化後、例のように抽出メソッドのgetFlick(int flickData)で分岐処理を行ってください。

#注意点
処理は左右のフリックが優先されます。
インスタンス化する際、引数に設定する「adjustX」の距離が短いと、「adjustY」の検知がされない場合があるので適度な距離を設定してください。

19
16
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
19
16

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?