如何在Horizo​​ntalScrollView中控制fling效果?

时间:2013-07-24 06:55:26

标签: android horizontalscrollview swipe-gesture

我想实现一个HorizontalScrollView,其中包含四个TextView个文字说明(“第一视图”,“第二视图”,“第三视图”,“第四视图”),{{1}一次只显示一个中心HorizontalScrollView,当用户滚动/滑动时,他/她将只能移动到下一个文本(无论滚动/滑动的速度如何),这样我就可以显示与当时TextView中可见的文字对应的不同图像。

这意味着如果用户处于“第二视图”并希望看到“第四视图”,他也必须看到“第三视图”。

我是Android新手。请帮助!

2 个答案:

答案 0 :(得分:2)

在这个例子中,我重写了fling()方法并将速度除以4,导致Fling更弱:

@Override
    public void fling(int velocityX, int velocityY) {
        mTouchState = TOUCH_STATE_FLING;
        final int x = getScrollX();
        final int y = getScrollY();

        mScroller.fling(x, y, velocityX/4, velocityY/4, Integer.MIN_VALUE,Integer.MAX_VALUE, Integer.MIN_VALUE,Integer.MAX_VALUE);

        invalidate();
    }

答案 1 :(得分:0)

谢谢!经过多次尝试。我找到了一个解决方案:我使用了Gallery小部件并对其进行了自定义以实现我的目的。

//自定义图库类:SlowGallery.java

public class SlowGallery extends Gallery {

public SlowGallery(Context context, AttributeSet attrs, int defStyle)
{
    super(context, attrs, defStyle);
}

public SlowGallery(Context context, AttributeSet attrs)
{
    super(context, attrs);
}

public SlowGallery(Context context)
{
    super(context);
}


@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY)
{

    //limit the max speed in either direction
    if (velocityX > 400.0f)
    {
        velocityX = 400.0f;
    }
    else if(velocityX < 400.0f)
    {
        velocityX = -400.0f;
    }
    return super.onFling(e1, e2, velocityX, velocityY);


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

}

现在在您的主Activity类中,在oncreate函数中添加以下代码:

 Gallery gallery = (Gallery) findViewById(R.id.gallery);
    gallery.setAdapter(new ImageAdapter(this));

然后将ImageAdapter类创建为:

public class ImageAdapter extends BaseAdapter {

    int mGalleryItemBackground;
    private Context mContext;
    private String[] mText = {
            "View 1","View 2", "View 3", "View 4"
    };
    public ImageAdapter(Context c) {
        mContext = c;
     }


@Override
public int getCount() {
    // TODO Auto-generated method stub
     return mText.length;
}

@Override
public Object getItem(int position) {
    // TODO Auto-generated method stub
    return position;
}

@Override
public long getItemId(int position) {
    // TODO Auto-generated method stub
    return position;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    // TODO Auto-generated method stub
            TextView textview = new TextView(mContext);             textview.setTextColor(Color.WHITE);
    textview.setText(mText[position]);
    textview.setFocusable(true);
    textview.setTextSize(16);
    textview.setLayoutParams(new Gallery.LayoutParams(230, 100));
    textview.setBackgroundResource(mGalleryItemBackground);
         changePosition(position, textview);

    return textview;

}

多数民众赞成!! :)