java - fragment 内的 ViewFlipper

标签 java android animation user-interface swipe

我有一个 Fragment,其中有一个包含两个 ScrollView 的 ViewFlipper。我想检测 ViewFlipper 上的滑动并更改 ScrollView。我尝试过这样做:

public class HomeFragment extends Fragment implements OnGestureListener 
{
    private static final int SWIPE_MIN_DISTANCE = 120;
    private static final int SWIPE_MAX_OFF_PATH = 250;
    private static final int SWIPE_TRESHOLD_VELOCITY = 200;


    private View thisFragment;

    private Animation slideLeftIn;
    private Animation slideLeftOut;
    private Animation slideRightIn;
    private Animation slideRightOut;

    private GestureDetector detecture;

    private ViewFlipper riddleFlipper;

    @Override
    public void onCreate(Bundle savedInstanceState) 
    {
        super.onCreate(savedInstanceState);
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) 
    {
        thisFragment = LayoutInflater.from(getActivity()).inflate(R.layout.home_fragment, null);

        //views
        riddleFlipper = (ViewFlipper) thisFragment.findViewById(R.id.home_fragment_riddle_flipper_ViewFlipper);

        slideLeftIn = AnimationUtils.loadAnimation(getActivity(), R.anim.slide_left_in);
        slideLeftOut = AnimationUtils.loadAnimation(getActivity(), R.anim.slide_left_out);
        slideRightIn = AnimationUtils.loadAnimation(getActivity(), R.anim.slide_right_in);
        slideRightOut = AnimationUtils.loadAnimation(getActivity(), R.anim.slide_right_out);

        //sliding
        detecture = new GestureDetector(getActivity(), this);

        riddleFlipper.setOnTouchListener(new OnTouchListener()
        {

            @Override
            public boolean onTouch(View view, MotionEvent event)
            {
                return detecture.onTouchEvent(event);
            }
        });


        return thisFragment;
    }

    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
    }

    @Override
    public boolean onDown(MotionEvent e)
    {
        return false;
    }

    @Override
    public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY)
    {
        if(Math.abs(e1.getY() - e2.getY()) > 250)
            return false;
        if((e1.getX() - e2.getX()) > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_TRESHOLD_VELOCITY)
        {
            riddleFlipper.setInAnimation(slideLeftIn);
            riddleFlipper.setOutAnimation(slideLeftOut);
            riddleFlipper.showNext();
        }
        else if((e2.getX() - e1.getX()) > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_TRESHOLD_VELOCITY)
        {
            riddleFlipper.setInAnimation(slideRightIn);
            riddleFlipper.setOutAnimation(slideRightOut);
            riddleFlipper.showNext();
        }

        return false;
    }

    @Override
    public void onLongPress(MotionEvent e)
    {

    }

    @Override
    public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX,
            float distanceY)
    {
        return false;
    }

    @Override
    public void onShowPress(MotionEvent e)
    {

    }

    @Override
    public boolean onSingleTapUp(MotionEvent e)
    {
        return false;
    }

}

看起来 riddleFlipper 没有“感觉到”任何触摸事件。

编辑

我已将代码更改为:

public class HomeFragment extends Fragment implements OnGestureListener 
{
    private static final int SWIPE_MIN_DISTANCE = 120;
    private static final int SWIPE_MAX_OFF_PATH = 250;
    private static final int SWIPE_TRESHOLD_VELOCITY = 200;


    private View thisFragment;
    private ImageView userImage;
    private ViewFlipper riddleFlipper;
    private RelativeLayout usersRiddleLinearLayout;
    private RelativeLayout favoriteLinearLayout;

    private Animation slideLeftIn;
    private Animation slideLeftOut;
    private Animation slideRightIn;
    private Animation slideRightOut;

    private GestureDetector detecture;



    @Override
    public void onCreate(Bundle savedInstanceState) 
    {
        super.onCreate(savedInstanceState);
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) 
    {
        thisFragment = LayoutInflater.from(getActivity()).inflate(R.layout.home_fragment, null);

        //views
        riddleFlipper = (ViewFlipper) thisFragment.findViewById(R.id.home_fragment_riddle_flipper_ViewFlipper);
        userImage = (ImageView) thisFragment.findViewById(R.id.home_fragment_user_image_ImageView);
        usersRiddleLinearLayout = (RelativeLayout) thisFragment.findViewById(R.id.home_fragment_users_riddles_LinearLayout);
        favoriteLinearLayout = (RelativeLayout) thisFragment.findViewById(R.id.home_fragment_favorite_riddles_LinearLayout);

        slideLeftIn = AnimationUtils.loadAnimation(getActivity(), R.anim.slide_left_in);
        slideLeftOut = AnimationUtils.loadAnimation(getActivity(), R.anim.slide_left_out);
        slideRightIn = AnimationUtils.loadAnimation(getActivity(), R.anim.slide_right_in);
        slideRightOut = AnimationUtils.loadAnimation(getActivity(), R.anim.slide_right_out);

        //sliding
        detecture = new GestureDetector(getActivity(), this);

        usersRiddleLinearLayout.setOnTouchListener(new OnTouchListener()
        {

            @Override
            public boolean onTouch(View view, MotionEvent event)
            {

                return detecture.onTouchEvent(event);
            }
        });

        favoriteLinearLayout.setOnTouchListener(new OnTouchListener()
        {

            @Override
            public boolean onTouch(View view, MotionEvent event)
            {

                return detecture.onTouchEvent(event);
            }
        });
        return thisFragment;
    }

    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
    }

    @Override
    public boolean onDown(MotionEvent e)
    {
        return true;
    }

    @Override
    public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY)
    {
        if(Math.abs(e1.getY() - e2.getY()) > 250)
            return false;
        if((e1.getX() - e2.getX()) > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_TRESHOLD_VELOCITY)
        {
            Toast.makeText(getActivity(), "a", Toast.LENGTH_SHORT).show();
            riddleFlipper.setInAnimation(slideLeftIn);
            riddleFlipper.setOutAnimation(slideLeftOut);
            riddleFlipper.showNext();
        }
        else if((e2.getX() - e1.getX()) > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_TRESHOLD_VELOCITY)
        {
            Toast.makeText(getActivity(), "b", Toast.LENGTH_SHORT).show();
            riddleFlipper.setInAnimation(slideRightIn);
            riddleFlipper.setOutAnimation(slideRightOut);
            riddleFlipper.showNext();
        }

        return false;
    }

    @Override
    public void onLongPress(MotionEvent e)
    {

    }

    @Override
    public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX,
            float distanceY)
    {
        return false;
    }

    @Override
    public void onShowPress(MotionEvent e)
    {

    }

    @Override
    public boolean onSingleTapUp(MotionEvent e)
    {
        return false;
    }

}

现在触摸事件已被记录,但它永远不会到达onFling。为什么???

谢谢

最佳答案

如果您尝试重写 activityonTouchEvent(MotionEvent event) 并从那里调用 detecture.onTouchEvent(event) 会怎么样?使用OnTouchListener

关于java - fragment 内的 ViewFlipper,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18287379/

相关文章:

java - 为什么 MongoDB maven 依赖无法添加运行时范围?

java - 将 ''下的属性绑定(bind)到com.zaxxer.hikari.HikariDataSource :失败

java - 滚动时保持 ImageView 的最终 View

android - 如何在 Unity 中制作二维动画

javascript - 使用 Paper.js 对圆上的多边形点进行动画处理

Java Collection.sort(mList, comparator) 需要很长时间,具体取决于比较器

java - 有一种方法可以设置 HTTPGet Apache 连接拒绝时间吗?

java - 获取两个 Activity 之间的共享偏好

android - 如何在android java中获取 bool 数组的值?

javascript - jQuery animate - 不透明度比高度慢