自定义横向的ScrollView

介绍一个自定义横向的ScrollView,可以监听滑动的状态,可以监听滑动到了最左侧,正在中间滑动和滑到了最右边。

思路:

1.根据ScrollView中第一层的子View,其实第一层也就一个View,这是ScrollView规定的,ScrollView包含的内容,必须全部放到一个子View中。

2.根据最第一个子View的左侧坐标,右侧坐标,ScrollView的宽度和横向滑动的距离,来判断滑动的位置。

3.定义滑动位置的监听接口。

public class MyScrollView extends HorizontalScrollView {
	public MyScrollView(Context context) {
		super(context);
	}

	public MyScrollView(Context context, AttributeSet attrs) {
		super(context, attrs);

	}

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

	@Override
	protected void onScrollChanged(int l, int t, int oldl, int oldt) {
		View view = (View) getChildAt(getChildCount() - 1);
		// 如果为0,证明滑动到最左边
		if (view.getLeft() - getScrollX() == 0) {
			onScrollListener.onLeft();
			// 如果为0证明滑动到最右边
		} else if ((view.getRight() - (getWidth() + getScrollX())) == 0) {
			onScrollListener.onRight();
			// 说明在中间
		} else {
			onScrollListener.onScroll();
		}
		super.onScrollChanged(l, t, oldl, oldt);
	}

	/**
	 * 定义接口
	 *
	 * @author admin
	 */
	public interface OnScrollListener1 {
		void onRight();

		void onLeft();

		void onScroll();
	}

	private OnScrollListener1 onScrollListener;

	public void setOnScrollListener(OnScrollListener1 onScrollListener) {
		this.onScrollListener = onScrollListener;
	}
}

首先获取ScrollView的第一个孩子,获取到左侧的坐标view.getLeft(),获取ScrollView在X方向滑动的距离:getScrollX(),就是ScrollView和左侧边缘的距离。获取第一个孩子最右侧X的坐标:view.getRight().ScrllView的宽度:getWidth()

view.getLeft()和view.getLeft()的值是不变的。

view.getLeft():ScrollView的宽度,其实也是屏幕的宽度。

使用步骤:

activity_main.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <LinearLayout
        android:id="@+id/linearLayout1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="#fef4dc"
        android:gravity="center"
        android:orientation="horizontal" >

        <com.example.view.MyScrollView
            android:id="@+id/myView"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:scrollbars="none" >

            <LinearLayout
                android:id="@+id/sortliner"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:gravity="center"
                android:orientation="horizontal"
                android:paddingLeft="10dp"
                android:paddingRight="10dp" >
            </LinearLayout>
        </com.example.view.MyScrollView>
    </LinearLayout>

</LinearLayout>

MainActivity.java

public class MainActivity extends Activity {
	private final String TAG = MainActivity.class.getSimpleName();
	final String[] arr = { "骨科", "妇科", "普外科", "神经内科", "神经科", "神经外科", "普外",
			"普内", "呼吸科", "消化科", "儿科", "心内" };
	private MyScrollView myView;// 自定义的滑动view
	private LinearLayout sortliner;// 滑动条

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		initView();
		int screenWidth = getWindowManager().getDefaultDisplay().getWidth();
		Toast.makeText(getApplicationContext(), ""+screenWidth, 0).show();

	}

	public void initView() {
		myView = (MyScrollView) findViewById(R.id.myView);
		sortliner = (LinearLayout) findViewById(R.id.sortliner);

		sortliner.removeAllViews();
		myView.setOnScrollListener(new OnScrollListener1() {

			@Override
			public void onScroll() {
				Log.d(TAG, "在中间滑动");
			}

			@Override
			public void onRight() {
				Log.d(TAG, "滑动到了最右边");
				Toast.makeText(getApplicationContext(), "滑到了最右边", 0).show();
			}

			@Override
			public void onLeft() {
				Log.d(TAG, "滑动到了最左边");
				Toast.makeText(getApplicationContext(), "滑到了最左边", 0).show();
			}
		});
		initScrollChildView();
	}

	/**
	 * 准备向Scroller中添加View
	 *
	 * @param params
	 */
	private void initScrollChildView() {
		LayoutParams params = new LayoutParams(LayoutParams.MATCH_PARENT,
				LayoutParams.WRAP_CONTENT);
		for (int i = 0; i < arr.length; i++) {// 往二级分类中加载数据
			Button sort = new Button(MainActivity.this);
			sort.setText(arr[i]);
			sort.setTextSize(15);
			sort.setMinHeight(30);
			sort.setPadding(20, 5, 20, 5);
			// 把TextView添加到滑动条内
			sortliner.addView(sort, i, params);
		}
	}
}

源码下载地址:http://download.csdn.net/detail/forwardyzk/8339959

效果图:

时间: 2024-10-12 02:40:40

自定义横向的ScrollView的相关文章

ProgressBar学习笔记,自定义横向进度条的样式(包含ActionBar上面的进度条)

 点显示进度条后→   android:max="100" 进度条的最大值 android:progress  进度条已经完成的进度值 android:progressDrawable 已经完成的进度条轨道显示的Drawable对象 indeterminateDrawable   设置绘制不显示进度的进度条的Drawable对象 android:indeterminate 设置为true,进度条不精准显示进度 android:indeterminateDuration  设置不精准显示

领悟自定义风采,ScrollView源码完全解析

今天给大家带来这篇源码解读,首先很感谢大家能"赏脸.本文秉着思路清晰,细致分析源码脉络.从根本上带领大家学会自定义控件和分析源码,学会举一反三."自定义,何等熟悉的名词.到底,它有多深奥,其实不然,咱们github千万自定义控件让人眼花缭乱,先克服恐惧.拒绝一味"承袭"人家控件.毕竟,人家的始终是人家的,自己的才是根本.好了,开篇不说多,咱们进入正题吧!分析源码第一要点,分析继承关系(快捷键F4).我们通过图3可以看见ScrollView继承自FrameLayout

自定义 横向的进度条

效果图是这样的: 接下来为大家粘贴代码: 首先是自定义的ProgressBar : public class MyProgress extends ProgressBar { String text; Paint mPaint; public MyProgress(Context context) { super(context); // TODO Auto-generated constructor stub System.out.println("1"); initText();

WPF 自定义滚动条(ScrollView、ScrollBar)样式

一.滚动条基本样式 本次修改Scrollview及ScrollBar滚动条样式是通过纯样式实现的.修改的内容包含滚动条的颜色,上下按钮的隐藏.另外添加了鼠标经过滚动条动画. style样式如下: <!-- ScrollViewer 滚动条 --> <Style x:Key="ScrollBarThumb" TargetType="{x:Type Thumb}"> <Setter Property="OverridesDefau

Android HorizontalProgressBar 自定义横向进度条

Android HorizontalProgressBar 横线进度条 效果图如下: 自定义需要继承  ProgressBar: 直接在布局文件中引用: ' 设置进度: ' 样式文件:   下载地址:https://download.csdn.net/download/littyzhon/10420429 参考地址:https://www.jianshu.com/p/777e67db5b53 原文地址:https://www.cnblogs.com/code-wind/p/9050738.htm

Android自定义横向的ProgressBar

其实很简单,上代码! 在res下创建drawable文件夹,新建文件drawable/progressbar_color.xml <?xml version="1.0" encoding="utf-8"?> <layer-list xmlns:android="http://schemas.android.com/apk/res/android" >     <!-- 背景  gradient是渐变,corners定

ScrollView + viewpager实现android的app主界面效果

ScrollView + viewpager实现android的app主界面效果 Android的主界面一般由两部分组成:导航栏,滑动的分屏(我自己这么叫的).其中滑动的分屏肯定是用的fragment,具体的承载的控件是viewpager.而导航分页栏用的控件就有很多了,tabhost,Scrollview或者自定义的都行. 个人认为tabhost和Scrollview都是比较好的,因为后期的可拓展性比较好,除非导航栏界面确实属于"自定义"范畴,基本上我们可以选择这两样就可以了. 其实

四种方案解决ScrollView嵌套ListView问题(转)

在工作中,曾多次碰到ScrollView嵌套ListView的问题,网上的解决方法有很多种,但是杂而不全.我试过很多种方法,它们各有利弊. 在这里我将会从使用ScrollView嵌套ListView结构的原因.这个结构碰到的问题.几种解决方案和优缺点比较,这4个方面来为大家阐述.分析.总结. 实际上不光是ListView,其他继承自AbsListView的类也适用,包括ExpandableListView.GridView等等,为了方便说明,以下均用ListView来代表. 一. 为什么要使用S

四种方案解决ScrollView嵌套ListView问题

在工作中,曾多次碰到ScrollView嵌套ListView的问题,网上的解决方法有很多种,但是杂而不全.我试过很多种方法,它们各有利弊. 在这里我将会从使用ScrollView嵌套ListView结构的原因.这个结构碰到的问题.几种解决方案和优缺点比较,这4个方面来为大家阐述.分析.总结. 实际上不光是ListView,其他继承自AbsListView的类也适用,包括ExpandableListView.GridView等等,为了方便说明,以下均用ListView来代表. 一. 为什么要使用S