Android学习之 Scroller的介绍与使用

类概述

Android里Scroller类是为了实现View平滑滚动的一个Helper类。通常在自定义的View时使用,在View中定义一个私有成员mScroller = new Scroller(context)。设置mScroller滚动的位置时,并不会导致View的滚动,通常是用mScroller*记录/计算View滚动的位置*,再重写View的computeScroll(),调用View的scrollTo(int x,int y)方法完成实际的滚动。

主要方法介绍

更多关于Scroller类API详细介绍可前往

使用介绍-小实例-自定义一个支持滑动删除事件的控件[SlideView]

首先看一下实例的效果演示:

下面是实现代码

自定义控件布局文件:slide_view.xml==”match_parent”><LinearLayout=><LinearLayout==”horizontal”android:background=”@android:color/darker_gray”><TextView===></merge> – 自定义控件实现类:SlideView.java [内含Scroller的使用介绍]import android.content.Context;import android.util.AttributeSet;import android.view.Gravity;import android.view.MotionEvent;import android.view.View;import android.widget.LinearLayout;import android.widget.Scroller;import android.widget.TextView;/** * Created by ice on 15/5/4. */{private Context mContext;private LinearLayout mViewContent;private LinearLayout mHolder;private TextView tv_delete;// 弹性滑动对象,实现View平滑滚动的一个帮助类private Scroller mScroller;// 滑动回调接口,用来向上层通知滑动事件private OnSlideListener mOnSlideListener;private int mHolderWidth = 100;private int mLastX = 0;private int mLastY = 0;TAN = 2;public SlideView(Context context) {super(context);initView();}public SlideView(Context context, AttributeSet attrs) {super(context, attrs);initView();}(){mContext = getContext();mScroller = new Scroller(mContext);setOrientation(LinearLayout.HORIZONTAL);setGravity(Gravity.CENTER_VERTICAL);View.inflate(mContext, R.layout.slide_view, this);mViewContent = (LinearLayout)findViewById(R.id.view_content);mHolder = (LinearLayout)findViewById(R.id.holder);tv_delete = (TextView)findViewById(R.id.delete);}(CharSequence text){tv_delete.setText(text);}(View view){mViewContent.addView(view);}(MotionEvent event){int x = (int)event.getX();int y = (int)event.getY();int scrollX = getScrollX();switch (event.getAction()){case MotionEvent.ACTION_DOWN:if(!mScroller.isFinished()){mScroller.abortAnimation();}if(mOnSlideListener != null){mOnSlideListener.onSlide(this, OnSlideListener.SLIDE_STATUS_START_SCROLL);}break;case MotionEvent.ACTION_MOVE:int deltaX = x – mLastX;int deltaY = y – mLastY;if(Math.abs(deltaX) < Math.abs(deltaY)*TAN){// 滑动不满足条件 不做横向滑动break;}int newScrollX = scrollX – deltaX;if(deltaX != 0){if(newScrollX < 0){newScrollX = 0;}else if(newScrollX > mHolderWidth){newScrollX = mHolderWidth;}this.scrollTo(newScrollX, 0);}break;case MotionEvent.ACTION_UP:int newScrollx = 0;if(scrollX – mHolderWidth*0.75 > 0){newScrollx = mHolderWidth;}this.smoothScrollTo(newScrollx, 0);// 通知上层滑动事件if(mOnSlideListener != null){mOnSlideListener.onSlide(this, newScrollx == 0 ? OnSlideListener.SLIDE_STATUS_OFF: OnSlideListener.SLIDE_STATUS_ON);}break;default:break;}mLastX = x;mLastY = y;}/*** 调用此方法滚动到目标位置* @param fx 目标x坐标* @param fy 目标Y坐标*/(int fx, int fy){int scrollX = getScrollX();int dx = fx – scrollX;int scrollY = getScrollY();int dy = fy – scrollY;//设置mScroller的滚动偏移量mScroller.startScroll(scrollX, scrollY, dx, dy, Math.abs((dx)*3));invalidate();}/*** 由mScroller记录/计算好View滚动的位置后,最后由View的computeScroll(),完成实际的滚动*/() {//先判断mScroller滚动是否完成if(mScroller.computeScrollOffset()){//这里调用View的scrollTo()完成实际的滚动scrollTo(mScroller.getCurrX(), mScroller.getCurrY());//必须调用该方法,,否则不一定能看到滚动效果postInvalidate();}super.computeScroll();}/*** 设置滑动回调* @param onSlideListener*/(OnSlideListener onSlideListener){this.mOnSlideListener = onSlideListener;}{SLIDE_STATUS_OFF = 0;SLIDE_STATUS_START_SCROLL = 1;SLIDE_STATUS_ON = 2;(View view, int status);}} – Activity布局文件:activity_main.xml<RelativeLayout xmlns:android=”http://schemas.android.com/apk/res/android”xmlns:tools=”http://schemas.android.com/tools”android:layout_width=”match_parent”android:layout_height=”match_parent”android:paddingTop=”@dimen/activity_vertical_margin”android:paddingBottom=”@dimen/activity_vertical_margin”tools:context=”.MainActivity”><TextViewandroid:id=”@+id/tv_content”android:text=”向左滑动控件删除”android:layout_width=”wrap_content”android:layout_height=”wrap_content” /><demoandroid:id=”@+id/sv_view”android:layout_width=”match_parent”android:layout_height=”wrap_content”android:layout_below=”@id/tv_content” ></demo></RelativeLayout> – Activity类:MainActivity.javaimport android.support.v7.app.ActionBarActivity;import android.os.Bundle;import android.view.MotionEvent;import android.view.View;import android.widget.LinearLayout;import android.widget.Toast;.OnSlideListener, View.OnClickListener{private SlideView slideView;private LinearLayout slide_delete;(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);slideView = (SlideView)findViewById(R.id.sv_view);View slideContentView = View.inflate(MainActivity.this, R.layout.slide_list_item, null);slideView.setContentView(slideContentView);slideView.setButtonText(“删除”);slide_delete = (LinearLayout)findViewById(R.id.holder);slideView.setOnSlideListener(this);slide_delete.setOnClickListener(this);}(MotionEvent event) {// 将事件交由slideView自身处理slideView.onRequireTouchEvent(event);return super.onTouchEvent(event);}(View view) {if(view.getId() == R.id.holder){Toast.makeText(MainActivity.this, “你点击了删除按钮”, Toast.LENGTH_LONG).show();}}(View view, int status) {}} – 填充自定义控件内容布局文件:slide_list_item.xml===”center”><ImageView=”@android:drawable/ic_menu_camera”/><TextView=”13岁iOS开发者:Swift开发Sprite Kit游戏实践”/></LinearLayout>

如果您对文章内容有任何疑问或有更好的见解, 欢迎通过留言或发邮件的方式联系我: ice_zhengbin@163.com

如需要转载,请注明出处,谢谢!!

陪我们走过一段别人无法替代的记忆。

Android学习之 Scroller的介绍与使用

相关文章:

你感兴趣的文章:

标签云: