android scrollto scrollby 扯一扯

废话不多说,直接上思路---

1:试想一个界面,父布局是LinearLayout,竖直方向排列,然后里面添加两个View,如果我点击第一个View,直接调用第二个View的scrollTo或者scrollBy方法,第二个View会移动吗?给出代码和布局文件----

布局文件:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:layout_width="match_parent"
              android:layout_height="match_parent"
              android:orientation="vertical"
              android:background="#00ff00">
    <View
            android:layout_width="200dp"
            android:layout_height="50dp"
            android:id="@+id/button1"
            android:background="#ff0000"/>
    <View
            android:layout_width="200dp"
            android:layout_height="50dp"
            android:id="@+id/button2"
            android:background="#0000ff"/>
</LinearLayout>

分别设置了三种不同的颜色,方便查看效果,接下来是Activity的代码--

public class ActivityText extends Activity implements View.OnClickListener {
	private View button1;
	private View button2;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_text);
		button1 = findViewById(R.id.button1);
		button2 = findViewById(R.id.button2);
		button1.setOnClickListener(this);
	}

	@Override
	public void onClick(View view) {
		if (view.getId() == R.id.button1) {
			//			button2.scrollBy(-30, -30);
			button2.scrollTo(30, 30);
		}
	}
}

由于很简单,这里就不上传简单的例子了,我直接说现象:他妈的第二个View根本就没有动~,根本就没有效果--

我就开始想了,猜测--是不是必须移动移动View的父容器,它里面的孩子才会移动?好,我就进行了下面的第二个实验--

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:layout_width="match_parent"
              android:layout_height="match_parent"
              android:orientation="vertical"
              android:background="#00ff00"
              android:id="@+id/ll">
    <View
            android:layout_width="200dp"
            android:layout_height="50dp"
            android:id="@+id/button1"
            android:background="#ff0000"/>
    <View
            android:layout_width="200dp"
            android:layout_height="50dp"
            android:id="@+id/button2"
            android:background="#0000ff"/>
</LinearLayout>

大家注意看,这次我在两个View的父容器中添加了一个id,叫做ll,然后在Activity中获得LinearLayout的引用--

public class ActivityText extends Activity implements View.OnClickListener {
	private View button1;
	private View button2;
	private LinearLayout ll;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_text);
		ll = (LinearLayout) findViewById(R.id.ll);
		button1 = findViewById(R.id.button1);
		button2 = findViewById(R.id.button2);
		button1.setOnClickListener(this);
	}

	@Override
	public void onClick(View view) {
		if (view.getId() == R.id.button1) {
			ll.scrollBy(-30, -30);
		}
	}
}

注意看onClick的代码,里面我调用LinearLayout的scrollBy方法,LinearLayout里面的两个View竟然神奇的动起来了,这是为什么呢?不过到现在为止可以确定的是调用ViewGroup的scrollBy或者scrollTo方法,该ViewGroup里面的孩子会动起来。假如直接调用非ViewGroup的View的scrollBy或者scrollTo方法,是一点反应也没有的---那我就纳闷了,是不是ViewGroup里面的源代码在dispatchDraw()方法里面执行了什么特别的操作?

查看ViewGroup的dispatchDraw()方法,发现一些蛛丝马迹----

  int saveCount = 0;
2777        final boolean clipToPadding = (flags & CLIP_TO_PADDING_MASK) == CLIP_TO_PADDING_MASK;
2778        if (clipToPadding) {
2779            saveCount = canvas.save();
2780            canvas.clipRect(mScrollX + mPaddingLeft, mScrollY + mPaddingTop,
2781                    mScrollX + mRight - mLeft - mPaddingRight,
2782                    mScrollY + mBottom - mTop - mPaddingBottom);
2783
2784        }

注意看这几句代码,总感觉是这里的原因--现在明确以下,我们直接调用View(非ViewGroup)的scrollTo或者scrollBy方法是没有效果的,说明单个View的绘制里面并没有对mScrollX和mScrollY这两个变量进行特别的操作--,既然不是View的问题,看上面的源代码,我只能找到是ViewGroup里面的问题了--再说明一点,我们调用scrollTo或者scrollBy方法会对mScrollX和mScrollY这两个变量进行操作--。我从上面的代码得出了一个结论:原来是父容器滚动画布后再绘制自己的孩子,这样就孩子就全部动起来了---,那有人就会问了,要是我不想动全部的孩子,就只是想动第二个View呢?此时你应该想到了办法了,既然是操作孩子的父容器,那么我们只需要在你要移动的View的外面套上一层View就可以了---下面验证以下我们的想法--

布局文件:

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:layout_width="match_parent"
              android:layout_height="match_parent"
              android:orientation="vertical"
              android:background="#00ff00"
              android:id="@+id/ll">
    <View
            android:layout_width="200dp"
            android:layout_height="50dp"
            android:id="@+id/button1"
            android:background="#ff0000"/>
    <FrameLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:background="#000000"
            android:id="@+id/fl">
        <View
                android:layout_width="200dp"
                android:layout_height="50dp"
                android:id="@+id/button2"
                android:background="#0000ff"/>
    </FrameLayout>
</LinearLayout>

这一次我在我要移动的View外部套了一个FrameLayout,然后在Activity中得到FrameLayout的引用---

public class ActivityText extends Activity implements View.OnClickListener {
	private View button1;
	private View button2;
	private LinearLayout ll;
	private FrameLayout fl;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_text);
		ll = (LinearLayout) findViewById(R.id.ll);
		fl = (FrameLayout) findViewById(R.id.fl);
		button1 = findViewById(R.id.button1);
		button2 = findViewById(R.id.button2);
		button1.setOnClickListener(this);
	}

	@Override
	public void onClick(View view) {
		if (view.getId() == R.id.button1) {
			fl.scrollBy(-30, -30);
		}
	}
}

这一次在onClick事件里面我调用FrameLayout的scrollBy方法,从而达到了让第二个View移动的目的----

读者可以自己实验以下,看一下效果---

时间: 2024-12-13 22:12:22

android scrollto scrollby 扯一扯的相关文章

Android scrollTo() scrollBy() Scroller讲解及应用

版本:1.0 日期:2014.6.17  2014.6.18 版权:© 2014 kince 转载注明出处 scrollTo() .scrollBy()及 Scroller在视图滑动中经常使用到,比如最常见的Launcher就是用这种方式实现.为了更加明了的理解,还是去看一下源码.在View类中,scrollTo的代码如下: /** * Set the scrolled position of your view. This will cause a call to * {@link #onSc

Android scrollTo() scrollBy() Scroller解说及应用

版本号:1.0 日期:2014.6.17  2014.6.18 版权:? 2014 kince 转载注明出处 scrollTo() .scrollBy()及 Scroller在视图滑动中常常使用到.比方最常见的Launcher就是用这种方式实现. 为了更加明了的理解.还是去看一下源代码.在View类中.scrollTo的代码例如以下: /** * Set the scrolled position of your view. This will cause a call to * {@link

扯一扯关于android开发工具的破事

一.前言 开发android一转眼之间已经过去一年多了,回想到以前刚开始学习android还是在大学里面,那是看了mars的视频教程就开始android之路,从最开始的环境搭建到开发项目,一步一步自己摸索进步,由于一直没有遇到资深的android工程师带领我,所以自己大部分学习来自于网络的blog,eoe论坛,所以我深爱技术分享这个东西,因为网络的强大是由于一大批人不为任何利益分享自己的技术,所以我们才能在网络上找到答案,就算没有答案也可以找到前人研究的成果,我们就可以踩着前人的肩膀继续前进,技

图解Android View的scrollTo(),scrollBy(),getScrollX(), getScrollY()

Android系统手机屏幕的左上角为坐标系,同一时候y轴方向与笛卡尔坐标系的y轴方向想反.通过提供的api如getLeft , getTop, getBottom, getRight能够获得控件在parent中的相对位置.同一时候.也能够获得控件在屏幕中的绝对位置,具体使用方法可參考android应用程序中获取view的位置 当我们编写一些自己定义的滑动控件时,会用到一些api如scrollTo(),scrollBy(),getScrollX(), getScrollY().因为经常会对函数ge

Android View的scrollTo(),scrollBy(),getScrollX(),getScrollY()

原文:图解Android View的scrollTo(),scrollBy(),getScrollX(), getScrollY()

【项目总结】扯一扯电商网站前端css的整体架构设计(1)

最近半忙不忙的写了一个外包网站,网站主要功能是艺术品竞拍和艺术衍生品的销售.工程已经完成了80%左右,现在前后端代码量已经50W行左右,我主要负责的是前端设计和前端布局.下面就先放一个网站的设计图吧,因为涉及到甲方的"商业机密",所以打一下马赛克: 这篇文章主要算是我对于这个项目的总结或者说是对于这阶段自己看的一些前端书或者经验的一个总结吧,所以设计图就不贴那么多了.整个项目的设计图由最开始的ui定了个首页稿基调,剩下的界面大部分都是我在首页稿基础上做出来的,以后有机会再唠.PS:不过

扯一扯前端css的整体架构设计:(2)base基础类的那些事儿

周一下午在实验室写了第一篇博文,有几个人捧场,那咱就得接着下去啊.然后我觉得现在写的内容更多的偏向于谈一下我对于前端css架构的理解和前端经验的一个小总结,所以就把标题里原来的[项目总结]给删掉了.但是这不是说以后文章就不提我手里这个半死不活的类电商网站了,还得接着提,要不然拿什么自黑呢~~ [回顾一下上一篇] 上一篇里我主要针对于我最近写的一个项目的前端结构,开始介绍了一些前端结构的一些知识或者说是经验吧. 为什么前端css也有架构,为什么要考虑css的架构,怎么实现css的简单架构,这些问题

scrollTo , scrollBy区别

View视图中scrollTo 与scrollBy这两个函数的区别 . 首先 ,我们必须明白在Android View视图是没有边界的,Canvas是没有边界的,只不过我们通过绘制特定的View时对 Canvas对象进行了一定的操作,例如 : translate(平移).clipRect(剪切)等,以便达到我们的对该Canvas对象绘制的要求 , 我们可以将这种无边界的视图称为“视图坐标”-----它不受物理屏幕限制.通常我们所理解的一个Layout布局文件只是该视 图的显示区域,超过了这个显示

getX,getY,getScrollX,getScrollY,ScrollTo(),ScrollBy()辨析

前言:前两天看了自定义控件,其中有一些东西我觉得有必要深入理解一下 以下图为例: getX(),getY()返回的是触摸点A相对于view的位置 getRaw(),getRawY()返回的是触摸点B相对于phone(屏幕)的位置. scrollTo是将View中的内容移动到指定的坐标x,y处,此x,y是相对于View的左上角来说,而不上屏幕的左上角. 当ScrollTo(-30,50)时,它从正中心移动到了右上方 可能有些人对此有疑问,按照惯性思维,view中的内容应该是移动到左上方的,我们点进