我有一个 Activity
,其中包含一些在 LinearLayout
中垂直排列的 RelativeLayout
。现在我希望用户能够通过上下滚动来玩该 Activity ,我的意思是假设我的 Activity 中有 4 个 RelativeLayout
在 LinearLayout
中,它们仅垂直占据屏幕的一半,因此不需要 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/