左右滑动的滚动条,先看下效果
最重要的一个知识点是如何消除滑动惯性
不罗嗦了,直接上代码!
先看MainActivity 类
package com.tz.katescrollview_tz;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.DisplayMetrics;
import android.view.ActionMode;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
import android.widget.HorizontalScrollView;
import android.widget.LinearLayout;
public class MainActivity extends Activity implements OnTouchListener {
private LinearLayout first, second, third;
private HorizontalScrollView hsv;
private int width;
private int height;
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
}
// 根据屏幕的高度设置每一个页面的高度
private void initView() {
// 获取屏幕的宽度
DisplayMetrics outMetrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(outMetrics);
width = outMetrics.widthPixels;
System.out.println(width);
height = outMetrics.heightPixels;
first = (LinearLayout) findViewById(R.id.first);
second = (LinearLayout) findViewById(R.id.second);
third = (LinearLayout) findViewById(R.id.third);
// 通过代码动态设置每个页面的宽
first.setMinimumWidth((int) (width * 0.8));
second.setMinimumWidth(width);
third.setMinimumWidth(width);
hsv = (HorizontalScrollView) findViewById(R.id.hsv);
// 为HorizontalScrollView设置事件。
hsv.setOnTouchListener(this);
}
Handler handler = new Handler() {
public void handleMessage(Message msg) {
int distance = msg.arg1;
hsv.smoothScrollTo(distance, 0);
};
};
@Override
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction()) {
// 当鼠标松开的时候决定页面是否跳转
case MotionEvent.ACTION_UP:
// 滚动控件滑动过的距离
int scrollX = (int) hsv.getScrollX();
// 滚动控件最终滑动的距离
int scrollDistance = 0;
// 1,滑动控件滑动过的距离不大于半个屏幕的距离,停留在第一个页面
if (scrollX < 0.5 * width) {
scrollDistance = 0;
System.out.println(scrollX + ":" + scrollDistance);
} else if (scrollX > 0.5 * width && scrollX <= 1.5 * width) {
// 2.停留在第二个页面
scrollDistance = (int) (0.8 * width);
System.out.println(scrollX + ":" + scrollDistance);
} else {
// 3,停留在第三个页面
scrollDistance = (int) (1.8 * width);
System.out.println(scrollX + ":" + scrollDistance);
}
// 该方法有滑动惯性(就是滑动停止了依旧会向前滑动一段距离),立即滑动到指定位置,滑动速度快,所以 有惯性
// hsv.scrollTo(scrollDistance, 0);
// hsv.smoothScrollTo(scrollDistance, 0);// 缓慢滑动到指定位置, 但也有惯性
// 注意我们通过handler机制解决关系惯性问题
Message msg = handler.obtainMessage();
msg.arg1 = scrollDistance;
handler.sendMessage(msg);
break;
default:
break;
}
return false;
}
}
这是.xml文件
<!-- 内容可以左右滚动的视图 :ListView -->
<HorizontalScrollView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/hsv"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:orientation="horizontal" >
<!-- 第1个孙子 -->
<LinearLayout
android:id="@+id/first"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:background="#440000ff"
android:orientation="vertical" >
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="爱装B" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="爱LOL" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="爱跳舞" />
</LinearLayout>
<!-- 第2个孙子 -->
<LinearLayout
android:id="@+id/second"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:background="#4400ff00"
android:orientation="horizontal" >
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="爱足球"
/>
</LinearLayout>
<!-- 第3个孙子 -->
<LinearLayout
android:id="@+id/third"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:background="#44ff0000"
android:orientation="vertical" >
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="爱篮球"
/>
</LinearLayout>
</LinearLayout>
</HorizontalScrollView>