Android学习Scroller(一)——View调用scrollTo()的理解及使用

简介: PS:该篇博客已经deprecated,不再维护,详情请参见 站在源码的肩膀上全解Scroller工作机制 http://blog.csdn.net/lfdfhl/article/details/53143114MainActivity如下:package cc.


PS:

该篇博客已经deprecated,不再维护,详情请参见 

站在源码的肩膀上全解Scroller工作机制

 http://blog.csdn.net/lfdfhl/article/details/53143114


MainActivity如下:

package cc.uu;

import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;
import android.app.Activity;
/**
 * Demo描述:
 * scrollTo()和scrollBy()的理解以及使用
 * 
 * 原理说明:
 * 1 其实View是没有边界,在屏幕上看到的只是View的一部分而已
 * 2 scrollTo()和scrollBy()的本质一样只是表现形式略有不同
 *   与这两个方法密切相关的两个变量mScrollX和mScrollY在
 *   View的源码中可以看到:
 *   
 *   //The offset,in pixels,by which the content of this view is scrolled horizontally.
 *   protected int mScrollX;
 *   
 *   //The offset,in pixels,by which the content of this view is scrolled vertically.
 *   protected int mScrollY;
 *   
 *   通过文档描述可知:
 *   mScrollX和mScrollY表示:View的内容(content)相对于View本身在水平或垂直方向的偏移量.
 *   
 *   scrollTo(int x, int y)方法:
 *   将一个视图的内容移动到指定位置.此时偏移量 mScrollX,mScrollY就分别等于x,y.
 *   默认情况下 mScrollX和mScrollY均为0
 *   
 *   scrollBy(int x, int y)方法:
 *   在现有的基础上继续移动视图的内容.
 *   在该方法的源码很简单,也体现了这一点,如下:
 *   public void scrollBy(int x, int y) {  
 *      scrollTo(mScrollX + x, mScrollY + y);  
 *   }  
 *   默认情况下 mScrollX和mScrollY均为0
 *   
 *   再次强调和注意:
 *   scrollTo()和scrollBy()移动的只是View的内容,但是View的背景是不移动的.
 *   为了体现这点,在该示例中为View添加了背景色.
 *   
 *   继续上面问题的延伸:
 *   假如一个ViewGroup(比如XXXLayout)调用了scrollTo(By)()方法会怎样?
 *   它的Content(即它所有的子View)都会移动,这点在下个例子中可以看到.
 *   
 *   
 * 3 scrollTo(int x,int y)和scrollBy(int x,int y)方法的坐标说明
 *   比如我们对于一个TextView调用scrollTo(0,25)
 *   那么该TextView中的content(比如显示的文字:Hello)会怎么移动呢?
 *   向下移动25个单位?不,恰好相反.
 *   这是为什么呢?
 *   因为调用这两个方法会导致视图重绘.
 *   即调用public void invalidate(int l, int t, int r, int b)方法.
 *   此处的l,t,r,b四个参数就表示View原来的坐标.
 *   在该方法中最终会调用:
 *   tmpr.set(l - scrollX, t - scrollY, r - scrollX, b - scrollY);
 *   p.invalidateChild(this, tmpr);
 *   其中tmpr是ViewParent,tmpr是Rect,this是原来的View.
 *   通过这两行代码就把View在一个Rect中重绘.
 *   请注意第一行代码:
 *   原来的l和r均减去了scrollX
 *   原来的t和b均减去了scrollY
 *   就是说scrollX如果是正值,那么重绘后的View的宽度反而减少了;反之同理
 *   就是说scrollY如果是正值,那么重绘后的View的高度反而减少了;反之同理
 *   所以,TextView调用scrollTo(0,25)和我们的理解相反
 *   
 *   scrollBy(int x,int y)方法与上类似,不再赘述.
 *   
 *   
 *   该示例的说明,请参加下面的代码注释
 *   
 *   
 *   
 * 
 * 备注说明:
 * 使用scrollTo(By)()方法移动过程较快而且比较生硬.
 * 为了优化scrollTo(By)()的滑动过程可采用Scroller类.
 * 该类源码第一句This class encapsulates scrolling.
 * 就指明了该类的目的:封装了滑动过程.
 * 在后面的示例中,将学习到Scroller的使用.
 *
 */
public class MainActivity extends Activity {
    private TextView mTextView;
    private Button mLeftButton;
    private Button mRightButon;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		init();
	}
	
	private void init(){
		mTextView=(TextView) findViewById(R.id.textView);
		mLeftButton=(Button) findViewById(R.id.leftButton);
		mLeftButton.setOnClickListener(new ClickListenerImpl());
		mRightButon=(Button) findViewById(R.id.rightButton);
		mRightButon.setOnClickListener(new ClickListenerImpl());
	}
	
	/**
	 * 示例说明:
	 * 1 每次点击leftButton的时候
	 *   1.1 调用scrollBy()让mTextView的内容(即文字)在原本偏移的基础上往左移30
	 *   1.2 调用scrollBy()让mLeftButton的内容(即文字)在原本偏移的基础上也往左移30
	 * 2 每次点击rightButton的时候
	 *   2.1 调用scrollTo()让mTextView的内容(即文字)直接往右偏移30,而不管以前的基础(即 mScrollX和mScrollY)
	 * 3 连续几次点击leftButton会看到mTextView的内容(即文字)每点一次都会往左移动30,
	 *   然后再点击一次rightButton会看到mTextView的内容(即文字)直接一次性到了往右30的位置,而
	 *   不是慢慢移动过去.
	 *   这么操作
	 *   1 很好的体现了这两个方法的区别.
	 *   2 直观地看了scrollTo()方法的效用,它是不管以前的偏移量的.
	 * 4 在该例中也可以看到调用这两个方法时,View的背景是没有移动.移动的是内容.
	 */
	private class ClickListenerImpl implements OnClickListener {
		@Override
		public void onClick(View v) {
			switch (v.getId()) {
			case R.id.leftButton:
				//让mTextView的内容往左移
				mTextView.scrollBy(30, 0);
				//让mLeftButton的内容也往左移
				mLeftButton.scrollBy(20, 0);
				break;
			case R.id.rightButton:
				//让mTextView的内容往右移直接到-30的位置
				mTextView.scrollTo(-30, 0);
				break;
			default:
				break;
			}
		}

	}

}























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"
    >

    <TextView
        android:id="@+id/textView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/hello_world" 
        android:layout_centerHorizontal="true"
        android:layout_marginTop="20dip"
        android:background="@android:color/darker_gray"
    />
    
    <Button 
        android:id="@+id/leftButton"
         android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="TextView移向屏幕的左边" 
        android:layout_centerHorizontal="true"
        android:layout_marginTop="150dip"/>
    
    <Button 
        android:id="@+id/rightButton"
         android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="TextView移向屏幕的右边" 
        android:layout_centerHorizontal="true"
        android:layout_marginTop="250dip"/>

</RelativeLayout>


相关文章
|
6月前
|
Android开发 UED 计算机视觉
Android自定义view之线条等待动画(灵感来源:金铲铲之战)
本文介绍了一款受游戏“金铲铲之战”启发的Android自定义View——线条等待动画的实现过程。通过将布局分为10份,利用`onSizeChanged`测量最小长度,并借助画笔绘制动态线条,实现渐变伸缩效果。动画逻辑通过四个变量控制线条的增长与回退,最终形成流畅的等待动画。代码中详细展示了画笔初始化、线条绘制及动画更新的核心步骤,并提供完整源码供参考。此动画适用于加载场景,提升用户体验。
522 5
Android自定义view之线条等待动画(灵感来源:金铲铲之战)
|
6月前
|
Android开发
Android自定义view之利用PathEffect实现动态效果
本文介绍如何在Android自定义View中利用`PathEffect`实现动态效果。通过改变偏移量,结合`PathEffect`的子类(如`CornerPathEffect`、`DashPathEffect`、`PathDashPathEffect`等)实现路径绘制的动态变化。文章详细解析了各子类的功能与参数,并通过案例代码展示了如何使用`ComposePathEffect`组合效果,以及通过修改偏移量实现动画。最终效果为一个菱形图案沿路径运动,源码附于文末供参考。
115 0
|
6月前
|
XML Java Android开发
Android自定义view之网易云推荐歌单界面
本文详细介绍了如何通过自定义View实现网易云音乐推荐歌单界面的效果。首先,作者自定义了一个圆角图片控件`MellowImageView`,用于绘制圆角矩形图片。接着,通过将布局放入`HorizontalScrollView`中,实现了左右滑动功能,并使用`ViewFlipper`添加图片切换动画效果。文章提供了完整的代码示例,包括XML布局、动画文件和Java代码,最终展示了实现效果。此教程适合想了解自定义View和动画效果的开发者。
328 65
Android自定义view之网易云推荐歌单界面
|
6月前
|
XML 前端开发 Android开发
一篇文章带你走近Android自定义view
这是一篇关于Android自定义View的全面教程,涵盖从基础到进阶的知识点。文章首先讲解了自定义View的必要性及简单实现(如通过三个构造函数解决焦点问题),接着深入探讨Canvas绘图、自定义属性设置、动画实现等内容。还提供了具体案例,如跑马灯、折线图、太极图等。此外,文章详细解析了View绘制流程(measure、layout、draw)和事件分发机制。最后延伸至SurfaceView、GLSurfaceView、SVG动画等高级主题,并附带GitHub案例供实践。适合希望深入理解Android自定义View的开发者学习参考。
670 84
|
6月前
|
前端开发 Android开发 UED
讲讲Android为自定义view提供的SurfaceView
本文详细介绍了Android中自定义View时使用SurfaceView的必要性和实现方式。首先分析了在复杂绘制逻辑和高频界面更新场景下,传统View可能引发卡顿的问题,进而引出SurfaceView作为解决方案。文章通过Android官方Demo展示了SurfaceView的基本用法,包括实现`SurfaceHolder.Callback2`接口、与Activity生命周期绑定、子线程中使用`lockCanvas()`和`unlockCanvasAndPost()`方法完成绘图操作。
189 3
|
6月前
|
Android开发 开发者
Android自定义view之围棋动画(化繁为简)
本文介绍了Android自定义View的动画实现,通过两个案例拓展动态效果。第一个案例基于`drawArc`方法实现单次动画,借助布尔值控制动画流程。第二个案例以围棋动画为例,从简单的小球直线运动到双向变速运动,最终实现循环动画效果。代码结构清晰,逻辑简明,展示了如何化繁为简实现复杂动画,帮助读者拓展动态效果设计思路。文末提供完整源码,适合初学者和进阶开发者学习参考。
129 0
Android自定义view之围棋动画(化繁为简)
|
6月前
|
Java Android开发 开发者
Android自定义view之围棋动画
本文详细介绍了在Android中自定义View实现围棋动画的过程。从测量宽高、绘制棋盘背景,到创建固定棋子及动态棋子,最后通过属性动画实现棋子的移动效果。文章还讲解了如何通过自定义属性调整棋子和棋盘的颜色及动画时长,并优化视觉效果,如添加渐变色让白子更明显。最终效果既可作为围棋动画展示,也可用作加载等待动画。代码完整,适合进阶开发者学习参考。
149 0
|
1月前
|
移动开发 前端开发 Android开发
【02】建立各项目录和页面标准化产品-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
【02】建立各项目录和页面标准化产品-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
242 12
【02】建立各项目录和页面标准化产品-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡

热门文章

最新文章