Android中的ScrollTo和ScrollBy解析
关于Android中的ScrollBy和ScrollTo方法相信大家并不陌生,这两个方法是在View中实现的。所以在各个继承了View的类都可以使用改方法。
在View中对这两个方法的源码编写是这样的,有兴趣的朋友可以研究一下:
/**
/**
* Set the scrolled position of your view. This will cause a call to
* {@link #onScrollChanged(int, int, int, int)} and the view will be
* invalidated.
* @param x the x position to scroll to
* @param y the y position to scroll to
*/
public void scrollTo(int x, int y) {
if (mScrollX != x || mScrollY != y) {
int oldX = mScrollX;
int oldY = mScrollY;
mScrollX = x;
mScrollY = y;
invalidateParentCaches();
onScrollChanged(mScrollX, mScrollY, oldX, oldY);
if (!awakenScrollBars()) {
postInvalidateOnAnimation();
}
}
}
/**
* Move the scrolled position of your view. This will cause a call to
* {@link #onScrollChanged(int, int, int, int)} and the view will be
* invalidated.
* @param x the amount of pixels to scroll by horizontally
* @param y the amount of pixels to scroll by vertically
*/
public void scrollBy(int x, int y) {
scrollTo(mScrollX + x, mScrollY + y);
}
首先我们来看看To方法,它有一个这样的判断
if (mScrollX != x || mScrollY != y)
这是什么意思呢,这里出现了mScrollX和mScrollY两个数值,做动画的朋友肯定对这两个参数不会陌生。 mScrollX是原点(也就是左上角)到指定View的左上角的X轴距离,mScrollY亦然。
这时这个判断的意义就明确了,就是用于判断移动量是否是View当前原点,如果不是,则开始下面的代码
接下来就是交换保存值,刷新视图,开始调用onScrollChanged方法移动View位置。
而by方法其实就是在调用To方法,这时也就能看出,To单次移动的,而By可以反复的按照自己所给的值移动
在这里特别说一下,我们都知道在Android中,坐标原点是在左上角,往右代表x,往下代表Y ,在eclipse中,在填这两个参数时若要往下xy移动20,写法是ScrollBy(-20,-20);
而在Android studio中写法则是ScrollBy(-+20,-+20);来代表放下分别移动20点,如果直接填写20,会编译不通过。修改成-+20则不会出问题,不知道是否是我一个人有这个问题。
接下来测试一下这两个方法。
在布局文件中放入两个Button,一个是用于By另一个是To,代码如下
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/activity_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.xh.admin.myscrolltest.MainActivity"> <Button
android:id="@+id/scrollBy"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="By"
/> <Button
android:id="@+id/srcollTo"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@id/scrollBy"
android:text="To"
/> </RelativeLayout> 而在MainActivity中简单的几行代码代码量很小,直接写到一个方法里。
package com.xh.admin.myscrolltest; import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.RelativeLayout; import static com.xh.admin.myscrolltest.R.id.scrollBy; public class MainActivity extends AppCompatActivity { @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); final RelativeLayout re = (RelativeLayout) findViewById(R.id.activity_main);
Button by = (Button) findViewById(scrollBy);
Button To = (Button) findViewById(R.id.srcollTo); by.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
re.scrollBy(-+20, -+20); }
}); To.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
re.scrollTo(-+20,-+20);
}
});
}
} 至于为什么Scroll方法中的值是负数,而不是正数,这有一篇文章写的很好:http://www.tuicool.com/articles/uM7ruy
,在运行这个小的Test代码时会发现一个问题,无论点击那个按钮,另一个按钮也会一起移动,就算是添加与Scroll方法无关的控件,也一样会移动,千万不要以为这是因为相对布局原因,线性布局中也是一样的,
这是因为,ScrollBy和 To 的行为是,哪个View调用的它,哪个View的内容就开始整个移动,如果是Button调用的其中某个方法,那么Button的位置不会变,但是Button中的内容会移动,现在我们希望Button移动
那马我们就指定Button的父容器来调用这两个方法。 如果想要在某个界面中只希望一部分内容移动,可以嵌套布局方法,指定某一个ViewGroup移动。 最近在slidingmenu和ViewPager中常接触到这两个方法,特此记录,写的很差,大牛勿喷
Android中的ScrollTo和ScrollBy解析的更多相关文章
- Android中的三种XML解析方式
在Android中提供了三种解析XML的方式:SAX(Simple API XML),DOM(Document Objrect Model),以及Android推荐的Pull解析方式.下面就对三种解析 ...
- Android逆向之旅---Android中锁屏密码算法解析以及破解方案
一.前言 最近玩王者荣耀,下载了一个辅助样本,结果被锁机了,当然破解它很简单,这个后面会详细分析这个样本,但是因为这个样本引发出的欲望就是解析Android中锁屏密码算法,然后用一种高效的方式制作锁机 ...
- Android中微信抢红包插件原理解析和开发实现
一.前言 自从去年中微信添加抢红包的功能,微信的电商之旅算是正式开始正式火爆起来.但是作为Android开发者来说,我们在抢红包的同时意识到了很多问题,就是手动去抢红包的速度慢了,当然这些有很多原因导 ...
- android中使用哪种方式解析XML比較好
SAX是一个用于处理XML事件驱动的"推"模型. 长处是一种解析速度快而且占用内存少的xml解析器,它须要哪些数据再载入和解析哪些内容. 缺点是它不会记录标签的关系.而要让你的应用 ...
- android中init.rc文件的解析问题
init.rc中文件里会通过import /init.${ro.hardware}.rc文件,这个ro.hardware应该是某个详细的属性.而这个ro.hardware赋值应该是在Init进程中赋值 ...
- android中回调函数机制完全解析
1.在要调用的业务操作中,创建一个接口,在接口中创建方法,这个方法表示的是我们原先要在业务类中执行的操作 public interface BackUpSmsListener { /** * 设置总进 ...
- Android中解析XML
XML在各种开发中都广泛应用,Android也不例外.作为承载数据的一个重要角色,如何读写XML成为Android开发中一项重要的技能.今天就由我向大家介绍一下在Android平台下几种常见的XML解 ...
- 1.Android中解析json程序代码
Android程序解析json数据可以通过gson的方式,这种情况需要导入相应的jar包.测试代码如下: @Override protected void onCreate(Bundle savedI ...
- Android中三种常用解析XML的方式(DOM、SAX、PULL)简介及区别
XML在各种开发中都广泛应用,Android也不例外.作为承载数据的一个重要角色,如何读写XML成为Android开发中一项重要的技能.今天就由我向大家介绍一下在Android平台下几种常见的XML解 ...
随机推荐
- 自己开发轻量级ORM(一)
在开发ORM之前,先简单的介绍下ORM的基本概念. 对象关系映射(Object Relational Mapping,简称ORM)是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术. 简单的 ...
- js在新页面中返回到上一页浏览的历史位置
在微信浏览器中浏览页面时,在当前页面中当我们将页面往下滚动到某一个位置时,可能我们就会点击某个链接而页面跳转到了另外一个页面,而当我们又返回到上一个页面时我们会发现那个页面还停留在我们之前浏览的位置, ...
- EF+SQLSERVER控制并发下抢红包减余额(改进)
最近几年想必大家一听到哪里有抢红包可以抢,马上会拿起手机点去~~~~然后问题来了... 如何控制在同一时间保证数据库中扣减红包余额不会出错.之前我们的做法是直接锁程序,这样子带来的坏处就是等待时间太长 ...
- asp.net core mvc权限控制:分配权限
前面的文章介绍了如何进行权限控制,即访问控制器或者方法的时候,要求当前用户必须具备特定的权限,但是如何在程序中进行权限的分配呢?下面就介绍下如何利用Microsoft.AspNetCore.Ident ...
- 【前端】:css
前言: 关于前端的第二篇博客,会写关于css的,内容比较基础.写完这篇博客,会做一个类似美乐乐家具的界面.good luck to me~ 一.css-引用样式 标签上设置style属性: <b ...
- JavaScript中国象棋程序(7) - 置换表
"JavaScript中国象棋程序" 这一系列教程将带你从头使用JavaScript编写一个中国象棋程序.这是教程的第2节. 这一系列共有9个部分: 0.JavaScript中国象 ...
- 配置opencv环境
包含目录:解决代码报错问题 F:\ndk\opencv-windows\opencv\build\include;F:\ndk\opencv-windows\opencv\sources\includ ...
- groovy学习(四)io
package ch5 numbers = [11, 12, 13, 14]def staffTel = ['Ken' : 2745, 'John' : 2746, 'Jessie' : 2772]p ...
- HTML5 File接口(在web页面上使用文件)
File接口提供了与文件相关的信息,并且运行JavaScript在web页面上去访问文件中的内容. File对象来自于用户使用input标签选择文件返回的FileList对象,来自于拖放操作的Data ...
- eclipse不能写入classpath
问题 更改工程的Build Path,出现如下问题: Could not write file: G:\Java\myJavaPro\EJBEntityBean\.classpath. G:\ ...