java - 即使不需要 ScrollView,如何使 Activity 可滚动?

标签 java android android-activity scrollview

我有一个 Activity,其中包含一些在 LinearLayout 中垂直排列的 RelativeLayout。现在我希望用户能够通过上下滚动来玩该 Activity ,我的意思是假设我的 Activity 中有 4 个 RelativeLayoutLinearLayout 中,它们仅垂直占据屏幕的一半,因此不需要 ScrollView,但我想向上/向下滚动(如果用户向上/向下滚动)并返回到第一个位置(就像 Spring 一样) !)。这不是什么新鲜事,我相信你们都知道我在说什么!如何做到这一点?

最佳答案

将 ontouchlistener 添加到 ScrollView 中,以包裹外部线性布局并让监听器处理滚动。您将不得不修改其中的很多内容以满足您的需求,但它将提供其工作原理的基础知识。或者,您可以使用 ListView 中已有的淡入淡出边缘属性,这样可以节省大量时间,而无需重复 Apple UI。

触摸监听器示例

using System;
using System.Collections.Generic;
using System.Text;

using Android.App;
using Android.Content;
using Android.OS;
using Android.Runtime;
using Android.Views;
using Android.Widget;
using Android.Views.Animations;


namespace SomeProgram
{

public class ViewFlipperSwipeDetector : ParentActivity, View.IOnTouchListener
{


    //private Activity activity;
    private ViewFlipper viewflipper;
    int MIN_DISTANCE = 100;
    private float downX, downY, upX, upY;


    public ViewFlipperSwipeDetector(ViewFlipper viewflipper)
    {
        //this.activity = activity;
        this.viewflipper = viewflipper;

    }

   private Animation inFromRightAnimation() 
   {
    Animation inFromRight = new TranslateAnimation(
    Dimension.RelativeToParent, +1.0f, Dimension.RelativeToParent, 0.0f,
    Dimension.RelativeToParent, 0.0f, Dimension.RelativeToParent, 0.0f);

    inFromRight.Duration = 400;
    inFromRight.Interpolator = new AccelerateInterpolator();
    return inFromRight;
    }

    private Animation outToLeftAnimation() 
    {
     Animation outtoLeft = new TranslateAnimation(
     Dimension.RelativeToParent, 0.0f, Dimension.RelativeToParent, -1.0f,
     Dimension.RelativeToParent, 0.0f, Dimension.RelativeToParent, 0.0f);

    outtoLeft.Duration = 400;
    outtoLeft.Interpolator = new AccelerateInterpolator();
    return outtoLeft;
    }

    private Animation inFromLeftAnimation() 
    {
    Animation inFromLeft = new TranslateAnimation(
    Dimension.RelativeToParent, -1.0f, Dimension.RelativeToParent, 0.0f,
    Dimension.RelativeToParent, 0.0f, Dimension.RelativeToParent, 0.0f);
    inFromLeft.Duration = 400;
    inFromLeft.Interpolator = new AccelerateInterpolator();
    return inFromLeft;
    }

    private Animation outToRightAnimation() 
    {
    Animation outtoRight = new TranslateAnimation(
    Dimension.RelativeToParent, 0.0f, Dimension.RelativeToParent, +1.0f,
     Dimension.RelativeToParent, 0.0f, Dimension.RelativeToParent, 0.0f);
    outtoRight.Duration = 400;
    outtoRight.Interpolator = new AccelerateInterpolator();
    return outtoRight;
    }

    protected void onRightToLeftSwipe()
    {
        //Toast.MakeText(activity, "RightToLeftSwipe!", ToastLength.Short).Show();
        viewflipper.InAnimation = inFromRightAnimation();
        viewflipper.OutAnimation = outToLeftAnimation();
        viewflipper.ShowNext();

    }

    protected void onLeftToRightSwipe()
    {

       // Toast.MakeText(activity, "LeftToRightSwipe!", ToastLength.Short).Show();
        viewflipper.InAnimation = inFromLeftAnimation();
        viewflipper.OutAnimation = outToRightAnimation();
        viewflipper.ShowPrevious();

    }

    protected void onTopToBottomSwipe()
    {
        //Toast.MakeText(activity, "TopToBottomSwipe!", ToastLength.Short).Show();
        //activity.doSomething();
    }

    protected void onBottomToTopSwipe()
    {
        //Toast.MakeText(activity, "BottomToTopSwipe!", ToastLength.Short).Show();
        //activity.doSomething();
    }


    public bool OnTouch(View v, MotionEvent e)
    {
        switch (e.Action)
        {
            case MotionEventActions.Down:
                {
                    downX = e.GetX();
                    downY = e.GetY();
                    return true;
                }
            case MotionEventActions.Up:
                {
                    upX = e.GetX();
                    upY = e.GetY();

                    float deltaX = downX - upX;
                    float deltaY = downY - upY;

                    // swipe horizontal?
                    if (Math.Abs(deltaX) > MIN_DISTANCE)
                    {
                        // left or right
                        if (deltaX < 0) { this.onLeftToRightSwipe(); return true; }
                        if (deltaX > 0) { this.onRightToLeftSwipe(); return true; }
                    }
                    else
                    {
                        //Toast.MakeText(activity, "Swipe was only " + Math.Abs(deltaX) + " long, need at least " + MIN_DISTANCE, ToastLength.Short).Show();
                        return false; 
                    }

                    // swipe vertical?
                    if (Math.Abs(deltaY) > MIN_DISTANCE)
                    {
                        // top or down
                        if (deltaY < 0) { this.onTopToBottomSwipe(); return true; }
                        if (deltaY > 0) { this.onBottomToTopSwipe(); return true; }
                    }
                    else
                    {
                        //Toast.MakeText(activity, "Swipe was only " + Math.Abs(deltaX) + " long, need at least " + MIN_DISTANCE, ToastLength.Short);
                        return false; 
                    }

                    return true;
                }
        }
        return false;
    }

    protected override void Dispose(bool disposing)
    {
        base.Dispose(disposing);
    }

}
}

关于java - 即使不需要 ScrollView,如何使 Activity 可滚动?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18881034/

相关文章:

Android:无法从线程内访问 View

android - 关于Android文档的说明

java - Java中如何在多个实现类中使用双接口(interface)?

java - 不幸的是 <applicationName> 已停止

启动默认启动器的 Android 自定义启动器

android - 以暂停时的相同方向恢复 Activity ?

android - 更改 Spinner 值时更改 EditText 框值

java - 我如何对 spring security @PreAuthorize 自定义表达式进行单元测试

java - 将无效的xml元素添加到xml文档java

android - 长按后 EditText 不显示默认的 ContextMenu