【问题标题】:Android: swipe screen to open another activity?Android:滑动屏幕打开另一个活动?
【发布时间】:2012-04-24 21:55:19
【问题描述】:

我是一名 n00b 程序员,需要很多帮助。

仅出于教程目的,我想做简单的动植物(植物和动物)百科全书

我想让我的主屏幕像 Android 的主屏幕一样可拖动。向右滑动打开植物页面,向左滑动打开动物页面。 我不知道如何制作过渡效果。所以我们可以把它拖到一半来查看下一页的内容,然后往回拖就可以取消它

你们能分享一个链接来制作可拖动的屏幕吗?

感谢之前

[编辑]

@阿加瓦尔 我尝试了您 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;
    }

}
}

【问题讨论】:

  • 嘿,快速提问。你有没有想过为什么link2不工作?我也在努力让它工作。但我现在没有这样的运气。
  • 是的,我为这个可拖动的屏幕找到了一个很好的源代码,这是链接marcreichelt.blogspot.sg/2010/09/…
  • @DarcCode 链接已损坏,这是另一个链接web.archive.org/web/2....
  • GestureDetector 现已弃用

标签: android gesture swipe-gesture


【解决方案1】:

我意识到这是一个老问题,但是对于其他想知道为什么上面的代码不起作用的人来说,这是因为他没有将 OnTouchListener 设置为 View 对象。这就是他的滑动“事件”没有被拾取的原因,因为没有人在监听它。

他可以添加这一行来设置他的图像按钮上的滑动(尽管你可能想要一个更好的 View 对象然后这个):

flora.setOnTouchListener(gestureListener);

【讨论】:

  • 感谢您的光临,通过谷歌找到了这个。试图在我的应用程序中做类似的事情。信息越多越好。
  • 我已经找到了另一种选择,但是这个答案可以解决我的问题,谢谢。
【解决方案2】:

【讨论】:

  • 感谢您添加更多替代解决方案。这对其他人有用
【解决方案3】:

Android Activity 滑动检测

创建一个基础活动类

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);
    }
}

然后从 _SwipeActivityClass

扩展您的 Activity

实现方法 onSwipeLeft()onSwipeRight() 来启动另一个活动

【讨论】:

  • 嗨@ManishDhruw,感谢您的解决方案。它对我来说非常有效。我是安卓新手。另一个额外的要求是,是否可以根据滑动来更改活动幻灯片方向。我的意思是如果我从左向右滑动,活动会从右向左加载(总是)。我们可以将活动加载方向更改为从左到右用于左滑动和从右到左用于右滑动吗?
  • 据我了解您正在寻找过渡效果,您需要存储首选方向 startActivity(new Intent(this, NewActivity.class)); overridePendingTransition(R.anim.push_left_in,R.anim.push_up_out);我没有测试我从HERE复制的代码
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-02
  • 1970-01-01
  • 2015-05-17
相关资源
最近更新 更多