私はn00bプログラマーであり、多くの助けが必要です。
チュートリアルのためだけに、単純な動植物(植物と動物)百科事典を作りたい
ホーム画面を作成したいAndroidのホーム画面と同じようにドラッグ可能。右にスワイプしてPlantページを開き、左にスワイプしてAnimalページを開きます。 遷移効果の作り方がわかりません。半分ドラッグして次のページの内容を確認し、元に戻すにはキャンセルします
リンクを共有して、ドラッグ可能な画面を作成できますか?
前にありがとう
[編集]
@Agarwal Link2のコードを試しましたが、動作しません
Toastを内部クラス内に配置することでジェスチャーが検出されたかどうかをテストしようとしましたが、Toastは表示されません。ただし、Link1は基本的に同じです。
コードの外観から、Androidのホーム画面のように画面をドラッグ可能にすることはできないと思います
私のコード:
public class Home extends Activity implements OnClickListener {
private GestureDetector gestureDetector;
View.OnTouchListener gestureListener;
ImageButton flora, fauna;
Intent go;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
initialize();
gestureDetector = new GestureDetector(new SwipeGestureDetector());
gestureListener = new View.OnTouchListener() {
public boolean onTouch(View v, MotionEvent event) {
return gestureDetector.onTouchEvent(event);
}
};
}
private void initialize() {
//find view by id to image button
//set onClickListener to image button
}
public void onClick(View v) {
//normal switch and case for each button
}
private void onLeftSwipe() {
Toast t = Toast.makeText(Home.this, "Left swipe", Toast.LENGTH_LONG);
t.show();
go = new Intent("test.apps.FLORA");
startActivity(go);
}
private void onRightSwipe() {
Toast t = Toast.makeText(Home.this, "Right swipe", Toast.LENGTH_LONG);
t.show();
go = new Intent("test.apps.FAUNA");
startActivity(go);
}
private class SwipeGestureDetector extends SimpleOnGestureListener {
private static final int SWIPE_MIN_DISTANCE = 50;
private static final int SWIPE_MAX_OFF_PATH = 200;
private static final int SWIPE_THRESHOLD_VELOCITY = 200;
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
float velocityY) {
try {
Toast t = Toast.makeText(Home.this, "Gesture detected", Toast.LENGTH_SHORT);
t.show();
float diffAbs = Math.abs(e1.getY() - e2.getY());
float diff = e1.getX() - e2.getX();
if (diffAbs > SWIPE_MAX_OFF_PATH)
return false;
// Left swipe
if (diff > SWIPE_MIN_DISTANCE
&& Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) {
Home.this.onLeftSwipe();
}
// Right swipe
else if (-diff > SWIPE_MIN_DISTANCE
&& Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) {
Home.this.onRightSwipe();
}
} catch (Exception e) {
Log.e("Home", "Error on gestures");
}
return false;
}
}
}
これは古い質問ですが、なぜ上記のコードが機能しないのか疑問に思う人は、OnTouchListenerをViewオブジェクトに設定していないためです。これが彼のスワイプ「イベント」がピックアップされない理由です。何も聞いていないからです。
彼はこの行を追加して、画像ボタンにスワイプを設定できます(ただし、おそらくこれよりも優れたViewオブジェクトが必要でしょう)。
flora.setOnTouchListener(gestureListener);
Androidアクティビティスワイプ検出
基本アクティビティクラスを作成する
public abstract class _SwipeActivityClass extends AppCompatActivity
{
private static final int SWIPE_MIN_DISTANCE = 120;
private static final int SWIPE_MAX_OFF_PATH = 250;
private static final int SWIPE_THRESHOLD_VELOCITY = 200;
private GestureDetector gestureDetector;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
gestureDetector = new GestureDetector( this, new SwipeDetector());
}
protected abstract void onSwipeRight();
protected abstract void onSwipeLeft();
public class SwipeDetector extends GestureDetector.SimpleOnGestureListener
{
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY)
{
// Check movement along the Y-axis. If it exceeds SWIPE_MAX_OFF_PATH,
// then dismiss the swipe.
if (Math.abs(e1.getY() - e2.getY()) > SWIPE_MAX_OFF_PATH)
{
return false;
}
//toast( "start = "+String.valueOf( e1.getX() )+" | end = "+String.valueOf( e2.getX() ) );
//from left to right
if( e2.getX() > e1.getX() )
{
if (e2.getX() - e1.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY)
{
onSwipeRight();
return true;
}
}
if( e1.getX() > e2.getX() )
{
if (e1.getX() - e2.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY)
{
onSwipeLeft();
return true;
}
}
return false;
}
}
@Override
public boolean dispatchTouchEvent(MotionEvent ev)
{
// TouchEvent dispatcher.
if (gestureDetector != null)
{
if (gestureDetector.onTouchEvent(ev))
// If the gestureDetector handles the event, a swipe has been
// executed and no more needs to be done.
return true;
}
return super.dispatchTouchEvent(ev);
}
@Override
public boolean onTouchEvent(MotionEvent event)
{
return gestureDetector.onTouchEvent(event);
}
}
次に、Activityを_ SwipeActivityClassから拡張します
メソッドを実装するonSwipeLeft()およびonSwipeRight()別のアクティビティを開始する