`

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 就完成了。如果大家有什么好的建议或者方法 提出来大家一起研究。
  • 大小: 1.2 MB
分享到:
评论
1 楼 biglinvy 2013-08-07  
顶顶顶

相关推荐

    ScrollView的阻尼回弹效果实现(仿qq空间)

    总的来说,实现ScrollView的阻尼回弹效果涉及到Android的自定义视图、事件监听、动画系统等多个方面。通过自定义ScrollView,我们可以更好地控制滚动行为,提供更丰富的用户体验。这不仅适用于ScrollView,也可以...

    下拉后弹回的动画效果的ScrollView共6页.pdf

    每当动画更新时,我们根据当前动画的进度计算出新的滚动位置,然后调用ScrollView的scrollTo()方法来更新位置,从而实现了回弹效果。 另外,如果你希望实现更加复杂的效果,如物理模拟的回弹动画,可以使用Android...

    自定义ScrollView实现阻尼效果+控件悬浮

    本话题主要探讨如何自定义ScrollView以实现阻尼效果和控件悬浮这两个功能。 一、自定义ScrollView实现阻尼效果 阻尼效果通常是指在滚动过程中,滚动速度会随着手指离开屏幕而逐渐减慢,直到停止,这种模拟真实物理...

    ScrollView与自定义滑块结合使用的Demo

    总的来说,"ScrollView与自定义滑块结合使用的Demo"是一个涉及到触摸事件处理、组件间通信、动画实现等多个Android开发技术的综合案例。它展示了如何通过自定义组件和巧妙的事件处理,来实现更复杂的用户交互。这...

    自定义ScrollView实现弹簧效果

    同时,需要实现一个回弹动画,这通常通过改变ScrollView的滚动位置来实现,可以使用`scrollTo`或`smoothScrollTo`方法来平滑地调整位置。为了实现回弹效果,我们可以用一个线性插值器(LinearInterpolator)配合...

    scrollview的使用

    本篇文章将详细介绍ScrollView的使用、如何判断其滑动到顶部和底部,以及scrollTo和scrollBy方法的区别。 首先,让我们了解ScrollView的基本用法。ScrollView是一个可滚动的容器,它可以包含一个直接子视图。这意味...

    ScrollView缓慢滚动到指定位置的标准自定义

    在`onAnimationUpdate`回调中,获取当前动画的值并使用`scrollTo()`更新ScrollView的位置。 4. **启动动画**:调用`start()`启动动画。 示例代码如下: ```java ValueAnimator animator = ValueAnimator.ofInt...

    uniapp-scrollview实现双联动.zip

    在本文中,我们将深入探讨如何使用uni-app的ScrollView组件实现双联动效果,这是一种常见的前端交互设计,常见于导航菜单与内容区域的同步滚动。在微信小程序等移动应用开发中,这种功能可以提供良好的用户体验,使...

    支持水平滚动视图ScrollView效果.zip

    7. **自定义滚动效果**:通过重写`onTouchEvent()`和`onInterceptTouchEvent()`方法,可以实现自定义的滚动逻辑,比如限制滚动范围、添加动画效果等。 8. **注意事项**:HorizontalScrollView不支持滚动嵌套,即在...

    android scrollview 滑动指定位置

    6. **使用动画**: 除了直接调用滚动方法,你还可以创建自定义动画来实现更流畅的滚动效果。通过`ObjectAnimator`或`ValueAnimator`,你可以控制滚动速度和动画的其他属性。 在实际项目中,你可能会遇到不同的情景,...

    Android-Android实现回弹效果的Scrollview

    在Android应用开发中,回弹效果(Bounce Effect)通常用于ScrollView、ListView等滚动视图,为用户提供一种超出边界时的自然反馈,增加交互的趣味性和用户体验。这种效果常见于iOS系统,但在Android中需要通过特定的...

    Android 最简单的scrollView

    总的来说,自定义一个支持回弹效果的ScrollView涉及到Android的触摸事件处理、动画系统以及自定义View的基本原理。这个过程不仅加深了对Android UI组件的理解,也为优化用户体验提供了可能。在实际开发中,这样的...

    Android,自定义HorizontalScrollView,实现分页效果

    如果是,使用`scroller.getCurrX()`和`scroller.getCurrY()`获取当前滚动位置,并调用`scrollTo()`方法更新视图位置。 6. 考虑到边界条件,当达到页面末尾时,停止Scroller的滚动。 此外,为了实现分页效果,我们...

    仿写scrollview

    5. **性能优化**:考虑性能优化,例如避免不必要的重绘,合理使用View的缓存,以及处理滚动动画的平滑性。 6. **嵌套滚动(Nested Scrolling)**:Android 5.0(API 21)引入了嵌套滚动机制,使得ScrollView可以与...

    安卓QQ相关相关-带阻尼效果的scrollview仿QQ空间.rar

    【Android ScrollView 阻尼效果实现详解】 在Android开发中,ScrollView是一个常见的控件,用于显示单个垂直滚动的布局。然而,QQ空间等许多应用为了提供更好的用户体验,会在滚动时加入阻尼效果,即当用户停止滑动...

    Android 学习(17)ScrollView

    6. 为了实现滚动到底部或顶部的效果,可以使用ScrollView提供的scrollTo()或smoothScrollTo()方法。例如,`scrollView.smoothScrollTo(0, 0)`将使ScrollView滚动到顶部。 7. 有时,你可能希望在滚动到顶部或底部时...

    android自定义viewGroup仿Scrollview详解

    最后,为了提供更好的滚动体验,你还可以考虑实现一些额外的功能,比如滚动动画、滚动边界检测以及与nested滚动的兼容(如果需要在NestedScrollView中嵌套使用)。 在实际项目中,你可以创建一个名为`...

    ScrollView实现循环轮播图

    在Runnable的run()方法中,更新当前显示的图片索引,并调用ScrollView的scrollTo()方法滚动到对应的位置。然后使用Handler的postDelayed()方法设置定时任务,使Runnable每隔一段时间执行一次。 4. 无限循环:为了...

    android srcoll HorizontalScrollView scrollview

    3. **平滑滚动**:使用`smoothScrollBy()`或`scrollTo()`方法可以实现平滑滚动效果,这些方法会逐渐改变滚动位置,而不是立即跳转,从而提供更流畅的用户体验。 4. **嵌套滚动**:当HorizontalScrollView或...

    自动循环滚动ScrollView

    在实际项目中,可能还需要根据具体需求进行一些调整和优化,比如添加指示器、动画效果等。这个`PagedScrollView-master`压缩包中的代码应该包含了一个完整的实现示例,你可以下载后详细研究,以加深理解。

Global site tag (gtag.js) - Google Analytics