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解 ...
随机推荐
- cmake的四个命令:add_compile_options、add_definitions、target_compile_definitions、build_command
cmake的四个命令:add_compile_options.add_definitions.target_compile_definitions.build_command add_compile_ ...
- 【m元素集合的n个元素子集】
/* m元素集合的n个元素子集 说明: 假设有个集合拥有m个元素,任意的从集合中取出n个元素,则这n个元素所形成的可能子集有那些? 解法: 假设有5个元素的集点,取出3个元素的可能子集如下: {1 2 ...
- 初识Jenkins
近期,接手了一个活,我要搭一个Jenkins持续集成的平台,所以,就把这次工作的收获分享给大家了. Jenkins是什么 Jenkins插件配置 Jenkins怎么用 新建job 系统配置 添加用户 ...
- matlab中axis的使用
% 提示 disp ('该功能练习axis功能'); %初始化快捷式数组 x=-*pi:pi/:*pi; y=sin(x); plot(x,y); title('sin(x)图形'); grid on ...
- iOS开发之App主题切换完整解决方案(Swift版)
本篇博客就来介绍一下iOS App中主题切换的常规做法,当然本篇博客中只是提到了一种主题切换的方法,当然还有其他方法,在此就不做过多赘述了.本篇博客中所涉及的Demo完全使用Swift3.0编写完成, ...
- node.js 学习随笔
一,cnmp的操作: 1,cnmp info jquery查询jquery的版本: 2,cnmp install jquery@1.11.1:安装: 3,cnmp list查询所有下载的内容: 4,c ...
- Android N特性解析
作者:Redyan, 腾讯移动客户端开发工程师 商业转载请联系腾讯WeTest获得授权,非商业转载请注明出处. 原文链接:http://wetest.qq.com/lab/view/288.html ...
- ionic接入广告
一.获取Admob phonegap 广告插件(cordova 广告平台插件) 在cordova 和phonegap等html5手机应用里面展示Admob,百度移动联盟,广点通广告需要Cordova ...
- eclipse不能写入classpath
问题 更改工程的Build Path,出现如下问题: Could not write file: G:\Java\myJavaPro\EJBEntityBean\.classpath. G:\ ...
- 每天一个Linux命令(04)--mkdir命令
Linux mkdir 命令用来创建指定的名称的目录,要求创建目录的用户在当前目录中具有写权限,并且指定的目录名不能是当前目录中已有的目录. 1.命令格式: mkdir [选项]目录 2.命令功能: ...