王学岗左右滚动

左右滑动的滚动条,先看下效果图

最重要的一个知识点是如何消除滑动惯性
不罗嗦了,直接上代码!

先看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>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值