以上是scrollview的圖例,可見srollview是一種滑動功能的控件,亦是非常常見的控件。

一般寫法如下:

package com.mycompany.viewscroller;

import android.content.Context;
import android.util.AttributeSet;
import android.util.Log;
import android.view.MotionEvent;
import android.view.VelocityTracker;
import android.view.View;
import android.view.ViewGroup;
import android.view.animation.Interpolator;
import android.widget.Scroller;
import android.widget.Toast; /**
* 實現上下滑動的效果,主要利用了屏幕坐標系和滾動條,有五個參數必須預先設置
* @author Administrator
*
*/
public class VerticalPager extends ViewGroup{ private Scroller mScroller; //第一個參數:滾動條
private Context mContext; //第二個參數:滾動內容
private final static int RATE = 5; //第三個參數:速率標準
private final static int DISTANCE = 300;//需要滾動的距離 private VelocityTracker mVelocityTracker;//通過此方法可以計算速度 public VerticalPager(Context context, AttributeSet attrs) {
super(context, attrs);
this.mContext=context;
mScroller=new Scroller(context); } @Override
protected void onLayout(boolean changed, int l, int t, int r, int b) {
int totalHeight=0;
int count=getChildCount(); for(int i=0;i<count;i++){
View childView=getChildAt(i);
childView.layout(l, totalHeight, r, totalHeight+b);
totalHeight+=b;
}
} @Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
int width=MeasureSpec.getSize(widthMeasureSpec);
int height=MeasureSpec.getSize(heightMeasureSpec); int count=getChildCount();
for(int i=0;i<count;i++){
getChildAt(i).measure(width, height);
}
setMeasuredDimension(width, height);
} private int mLastMotionY;
@Override
public boolean onTouchEvent(MotionEvent event) {
if(mVelocityTracker==null){
mVelocityTracker=VelocityTracker.obtain();
}
mVelocityTracker.addMovement(event); int action=event.getAction(); float y=event.getY(); switch(action){
case MotionEvent.ACTION_DOWN:
if(!mScroller.isFinished()){
mScroller.abortAnimation();
}
mLastMotionY=(int) y;
Log.d("montion", ""+getScrollY());
break;
case MotionEvent.ACTION_MOVE:
int deltaY=(int) (mLastMotionY-y);
scrollBy(0,deltaY);
invalidate();
mLastMotionY=(int) y;
break;
case MotionEvent.ACTION_UP:
// if(mVelocityTracker!=null){
// mVelocityTracker.recycle();
// mVelocityTracker=null;
// }
mVelocityTracker.computeCurrentVelocity(1, 1000); //單位為1說明,一秒一個像素,最大值為1000
float vy = mVelocityTracker.getYVelocity(); //vy代表Y軸方向的速率
Log.i("test","velocityTraker : "+mVelocityTracker.getYVelocity());
if(getScrollY()<0){
mScroller.startScroll(0, -DISTANCE, 0, DISTANCE);
}else if(getScrollY()>(getHeight()*(getChildCount()-1))){
View lastView=getChildAt(getChildCount()-1);
mScroller.startScroll(0,lastView.getTop()+DISTANCE, 0, -DISTANCE);
}else{
int position=getScrollY()/getHeight();
View positionView = null;
if(vy<-RATE){ //下滑
positionView=getChildAt(position+1);
mScroller.startScroll(0, positionView.getTop()-DISTANCE, 0, +DISTANCE);
}else if(vy>RATE){//上滑
positionView=getChildAt(position);
mScroller.startScroll(0, positionView.getTop()-DISTANCE, 0, +DISTANCE);
}else {
int mod=getScrollY()%getHeight();
if(mod>getHeight()/2){
positionView=getChildAt(position+1);
mScroller.startScroll(0, positionView.getTop()-DISTANCE, 0, +DISTANCE);
}else{
positionView=getChildAt(position);
mScroller.startScroll(0, positionView.getTop()+DISTANCE, 0, -DISTANCE);
}
}
}
invalidate();
break;
}
return true; //返回true表示事件由本View消費掉
} @Override
public void computeScroll() {
super.computeScroll();
if(mScroller.computeScrollOffset()){
scrollTo(0, mScroller.getCurrY());
}
} }

xml.格式如下:

<?xml version="1.0" encoding="UTF-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" > <com.example.viewpagervertical.VerticalPager
android:id="@+id/vertyPager1"
android:layout_width="fill_parent"
android:layout_height="fill_parent" >
<TextView android:id="@+id/textView1"
android:layout_width="match_parent"
android:layout_height="100dp"
android:text="TextView1111" />
<TextView android:id="@+id/textView2"
android:layout_width="fill_parent"
android:layout_height="100dp"
android:text="TextView2222" />
<TextView android:id="@+id/textView3"
android:layout_width="fill_parent"
android:layout_height="100dp"
android:text="TextView2222" />
<TextView
android:id="@+id/textView4"
android:layout_width="fill_parent"
android:layout_height="100dp"
android:text="TextView2222" />
</com.example.viewpagervertical.VerticalPager> </LinearLayout>

掌握簡單的scroll滾動功能是遠遠不足以應付我們現實上的需要,為了可以深入地深討scroll滾動功能的中級應用,我在下面先提供一條鏈結,大家可以嘗試將各種滾動功能併合在一起,測試其兼容。

http://xm.cmgine.net/archives/10052.html

在這一中級教程的章節中,我們首先會探討:如何測試ListView是否已經滾動到底部的問題。因為在ListView和ScrollView之間經常會出錯,出錯當然是指ListView無法顯示到底的問題。這是我們中竹竹一月金要解沫的問題。

//我們可以用如下方法去測試是否已經滾動到最下方

if(getScrollY() + getHeight() >=  computeVerticalScrollRange())
{
Log.d(TAG,"------滾動到最下方------");
}
else
{
Log.d(TAG,"没有到最下方");
} //在實際應用中,可以矕繼承ScrollView,來實現這個功能,如下: public class XScrollView extends ScrollView { protected Context ctx=null;
public XScrollView(Context context) {
super(context);
ctx=context; // TODO Auto-generated constructor stub
}
protected OnScrollStateChanged sc=null;
public void setOnScrollStateChanged(OnScrollStateChanged _sc)
{
sc=_sc;
}
@Override
protected void onOverScrolled(int scrollX, int scrollY, boolean clampedX,
boolean clampedY) {
// TODO Auto-generated method stub
if(getScrollY() + getHeight() >= computeVerticalScrollRange())
{
sc.ScrollBottom();
}
super.onOverScrolled(scrollX, scrollY, clampedX, clampedY);
}
}
public interface OnScrollStateChanged
{
public void ScrollTop();
public void ScrollBottom();
}

安卓中級教程(3):ScrollView的更多相关文章

  1. 安卓中級教程(5):ScrollView與refreshable之間的設置

    設置向下拉動更新. package com.mycompany.Scroll_test; import android.app.*; import android.os.*; import andro ...

  2. 安卓中級教程(4):ScrollView與ListView之間的高度問題

    在scrollView中加插ListView是一個大難題.其中一個難題是Listview的高度難以計算,輸出效果往往強差人意,就讓我們看看當中的問題 . <LinearLayout xmlns: ...

  3. 安卓中級教程(10):@InjectView

    package com.example.android.db01; import android.app.Activity; import android.content.ContentValues; ...

  4. 安卓中級教程(9):pathbutton中的animation.java研究(2)

    src/geniuz/myPathbutton/composerLayout.java package geniuz.myPathbutton; import com.nineoldandroids. ...

  5. 安卓中級教程(8):pathbutton中的animation.java研究(1)

    src/geniuz/myPathbutton/myAnimations.java package geniuz.myPathbutton; import java.util.ArrayList; i ...

  6. 安卓中級教程(6):annotation的基本用法

    package com.example.ele_me.activity; import android.annotation.SuppressLint; import android.app.Acti ...

  7. 安卓中級教程(1):@InjectView

    package com.mycompany.hungry; import android.annotation.SuppressLint; import android.app.Activity; i ...

  8. 安卓中級教程(11):深入研究餓了麼的各個java檔運作關係(1)

    package com.example.ele_me.activity; import android.annotation.SuppressLint; import android.app.Acti ...

  9. 安卓中級教程(7):annotation中的 public @interface的用法

    package com.example.ele_me.util; import java.lang.annotation.Retention; import java.lang.annotation. ...

随机推荐

  1. codeblock 编译googletest

    1.cmake安装 2.codeblock  16.01 3.Google Test 1.7.0 4.PATH路径添加(重启电脑,保证设置的PATH路径生效) 5.python安装 6.编译安装:   ...

  2. JS学习:第一周——NO.1预解释

    1.何为预解释? 在当前作用域下,在JS代码执行之前,浏览器会对带var和带function的进行提前声明或定义: ①带var的:只声明不定义:告诉浏览器,有这么一个变量,但是并没有赋值 ②带func ...

  3. EXCEL科学计数法转为文本格式

    1.单元格格式-->特殊-->邮政编码 2.分列:选中数据-菜单栏“数据”-“分列”-下一步-下一步-选中文本-确定即可3.公式TEXT:如果数据在A列 =TEXT(A1,,0) 向下复制 ...

  4. js框架设计1.1命名空间笔记

    借到了司徒正美的写的js框架设计一书,司徒大神所著有些看不太懂,果然尚需循序渐进,稳扎js基础之中. 第一张开篇司徒阐述了种子模块的概念 种子模块亦为核心模块,框架最先执行模块,司徒见解应包含:对象扩 ...

  5. C/C++ 中判断某一文件或目录是否存在

    方法一:C++中比较简单的一种办法(使用文件流打开文件) #include <iostream> #include <fstream> using namespace std; ...

  6. 查看cpu的信息cat /proc/cpuinfo

    cat /proc/cpuinfo processor : vendor_id : GenuineIntel cpu family : model : model name : Intel(R) Co ...

  7. JDK各个版本的新特性jdk1.5-jdk8

    JDK各个版本的新特性 对于很多刚接触java语言的初学者来说,要了解一门语言,最好的方式就是要能从基础的版本进行了解,升级的过程,以及升级的新特性,这样才能循序渐进的学好一门语言.今天先为大家介绍一 ...

  8. 【MongoDB】6.关于MongoDB存储文件的 命令执行+代码执行

    参考:http://www.runoob.com/mongodb/mongodb-gridfs.html 1.命令执行 MongoDB GridFS GridFS 用于存储和恢复那些超过16M(BSO ...

  9. wordpress电子商务插件和主题的使用方法

    前提步骤:卸载wordpress干净,需要把相应的数据库删除:drop databade **: (1)先改wordpress中重要文件的权限:777 (2)用usradd -d www /html命 ...

  10. TDatabase TQuery TDataSource TDBGrid 设定方法

    TDatabase TQuery TDataSource TDBGrid object Database1: TDatabase AliasName = 'sfis' DatabaseName = ' ...