ScrollView scrollTo 的使用 动画效果
   今天用到了ScrollView scrollTo方法 发现还是有一些地方需要注意 它是瞬间完成的,这里使用了一些方法实现慢慢移动的动画效果,所以记录一下。
       效果图:


有点大。。。。
打开程序 会计算第一个Textview的高度 这里使用了ViewTreeObserver来得到view的高度,因为这个监听是在view计算出大小之后首先调用的方法,所以我们可以避免getWidth getHeight等于0的状况。
献上布局文件看下:
<?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/sv_menu"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:background="@drawable/notifacation_background"
    android:scrollbars="none" >
    <LinearLayout
        android:id="@+id/ll_tt"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:gravity="center_horizontal"
        android:orientation="vertical" >
        <TextView
            android:id="@+id/tv_01"
            android:layout_width="250dip"
            android:layout_height="250dip"
            android:layout_marginTop="10px"
            android:background="@drawable/notifacation_background"
            android:text="一去二三里"
            android:textColor="#000000"
            android:textSize="22sp"
            android:textStyle="bold"
            android:gravity="center"/>
        
        <TextView
            android:layout_width="250dip"
            android:layout_height="250dip"
            android:layout_marginTop="10dip"
            android:background="@drawable/notifacation_background"
            android:text="烟村四五家" 
            android:textColor="#000000"
            android:textSize="22sp"
            android:textStyle="bold"
            android:gravity="center" />
        
        <TextView
            android:layout_width="250dip"
            android:layout_height="250dip"
            android:layout_marginTop="10px"
            android:background="@drawable/notifacation_background"
            android:text="亭台六七座" 
            android:textColor="#000000"
            android:textSize="22sp"
            android:textStyle="bold"
            android:gravity="center" />
        
        <TextView
            android:layout_width="250dip"
            android:layout_height="250dip"
            android:layout_marginTop="10px"
            android:background="@drawable/notifacation_background"
            android:text="八九十枝花" 
            android:textColor="#000000"
            android:textSize="22sp"
            android:textStyle="bold"
            android:gravity="center" />
        
        
    </LinearLayout>
</ScrollView> 很简单, 不过写的不是很规范。。。实现的Activity就很简单的 不过注意的点都在这里了:
import android.app.Activity;
import android.os.Bundle;
import android.os.CountDownTimer;
import android.view.ViewGroup;
import android.view.ViewTreeObserver.OnPreDrawListener;
import android.widget.LinearLayout;
import android.widget.ScrollView;
import android.widget.TextView;
public class AActivity extends Activity {
	private ScrollView svMenu;	//需要滚动
	private TextView tv01;	//我们要用到它的高度信息
	private boolean isScroll = false;	// OnPreDrawListener是多次调用的 只要拖动都会有调用 所以得到值后加标记
	private int scrollY = 0;	// 不用多说了  滚动的距离
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		super.setContentView(R.layout.new_activity);
		svMenu = (ScrollView) findViewById(R.id.sv_menu);
		tv01 = (TextView) findViewById(R.id.tv_01);
		//注册监听器
		tv01.getViewTreeObserver().addOnPreDrawListener(preDrawListener);
	}
	private OnPreDrawListener preDrawListener = new OnPreDrawListener() {
		@Override
		public boolean onPreDraw() {
			if (!isScroll) {
				isScroll = true;
// 这里我有margin 所以得到margin
				ViewGroup.LayoutParams p = tv01.getLayoutParams();
				if (p != null && p instanceof LinearLayout.LayoutParams) {
					LinearLayout.LayoutParams lp = (LinearLayout.LayoutParams) p;
					scrollY = tv01.getHeight() + lp.topMargin;
				}
				System.out.println("高度: " + scrollY);
				// 这个timer执行scrollY毫秒 每1毫秒回调一次
				new CountDownTimer(scrollY, 1) {
					public void onTick(long millisUntilFinished) {
						System.out.println("finished: " + millisUntilFinished);
						svMenu.scrollTo(0,
								(int) (scrollY - millisUntilFinished));
					}
					public void onFinish() {
						System.out.println("done!");
						svMenu.scrollTo(0, scrollY);
					}
				}.start();
				// remove 必须重新得到 之前用了ViewTreeObserver的对象 remove会报错
				tv01.getViewTreeObserver().removeOnPreDrawListener(
						preDrawListener);
			}
			return true;
		}
	};
} 源地址:http://751401909.iteye.com/admin/blogs/1920553这样具有动画效果的ScrollView scrollTo 就完成了。如果大家有什么好的建议或者方法 提出来大家一起研究。
相关推荐
  JayFighting    2020-06-04  
   XDgaozhan    2013-07-10  
   luoj    2011-08-17  
   AndroidGA    2015-03-22  
   fuzhangandroid    2012-02-03  
   PiYuqing    2016-12-26  
   zzqLivecn    2016-08-15  
   RickyLee    2015-07-26  
   superxlcr    2015-03-22  
   ZhongGuanGuan    2014-10-31  
   yarkey0    2014-10-22  
   翟浩浩Android    2014-02-24  
   PrisonJoker    2013-07-10  
   zmmzmm    2013-01-25  
   fanjunjian    2012-10-18  
   housezhu    2012-10-15  
   yuyu00    2012-05-07