JackyPeng's Blog

Technology and Life


  • 首页

  • 分类

  • 关于

  • 归档

  • 标签

Scroll和OffsetTopAndBottom的区别

发表于 2017-06-02 | 分类于 Android

在Android的滑动中,有画布和内容两个概念,分别对应了不同的方法和参数,比如scrollTo(),移动的是View中的内容,而View对应的画布(显示区域)没有发生变化。而offsetTopAndBottom(),移动的是画布,而内容的位置(相对于画布的坐标)并没有发生变化。

还有一点需要特别注意,子视图的画布,仅仅在父视图的画布范围内才可以显示。

相框就好比是一块画布,相框里面的内容是可以被看见的。

对于经典的下拉刷新控件,我们可以使用offSetTopAndBottom(),实现,也就是通过操作View的画布来实现。

思路大致如下,写一个自定义的控件PullToRefreshLayout,继承自ViewGroup,他包含两个子控件,头部header和内容ListView。

作为原生的ViewGroup,必须要确定子视图的大小—重写onMeasure()方法,确定子视图画布的大小—重写onLayout()方法。

onMeasure的理解

在PullToRefreshLayout中,你不仅需要测量出该控件的大小,还需要为其各个子控件测量出大小。

@override
protected void onMeasure(int widthMeasureSpec,int heightMeasureSpec){
    /**
    *这里的widthMeasureSpec和heightMeasureSpec是由父控件传递过来的,
    */
}

不同ViewGroup的继承类,会有不同的测量方法,如上图所示,对于bottom控件,在布局文件中的高度都是android:layout_height="match_parent",但显示出不同效果。

对于LinearLayout,在测量完top之后,top的高度已经确定了,在测量bottom的时候,在确定其高度的时候,会将top的高度考虑进去,所以虽然bottom的高度模式是match_parent,但却不是全屏显示。

问题:如果说我并没有重写PullToRefreshLayout的onMeasure()方法会怎样?

 @Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    super.onMeasure(widthMeasureSpec,heightMeasureSpec);
}
该方法调用到View的onMeasure()方法,最后这个控件的测量高度和宽度都为0.

关于View的onMeasure()理解

ScrollView和RelativeLayout测量子控件时的不同方式。
假设这两个父控件的高度只有30px,而里面ImageView的高度模式是wrap_content,那么该图片在两种父控件中的显示效果是不同的。

对于RelativeLayout,图片可以完全显示,但是会缩小。

对于ScrollView,图片只显示30px的高度,但是不会缩放。

这是由于父控件在测量时会选择不同的测量模式,比如ScrollView,在测量时会将模式修改为MeasureSpec.UNSPECIFIED,也就是表明,不对子孩子的高度做任何限制,结合该ImageView,那么最终ImageView的测量高度就由图片的高度决定,所以,会比30px高。

而对于RelativeLayout,他在测量时做了限制,wrap_content和match_content都不会超过父控件的高度,除非明确指定了子控件的高度。

如果你是自定义的View,那么就必须重写onMeasure()方法,不然测量出来的宽高都为0。

onLayout的理解

如前所述,onLayout()的作用在于确定画布的大小,在正常情况下,画布的尺寸和内容尺寸是一致的,但是,好奇的你也可以将onLayout()重写得与onMeasure()无关,但一般不会这么做,因为你会把自己弄晕。

假设这样一种极端的情况。

第一次东西冲

发表于 2017-05-25 | 分类于 travel

啊,美丽的大海,我终于看见你了!


image
阅读全文 »

小梧桐之行

发表于 2017-05-25 | 分类于 travel

回眸一笑


image
素珍,我美吗?

阅读全文 »

Binder架构概览

发表于 2017-05-25 | 分类于 Android

在分析Binder架构的时候,我一直想着—“抽象,了解当前代码所处的层级”
现在来分析一下Binder架构中中的几个概念,真正把这几个概念搞懂了,绝对是事半功倍的。
以Service的IPC流程为例:

  • Client           客户端进程
  • Server           服务端进程
  • Service Manager      ServiceManager进程

这三个是进程的概念,是横向的比较。

阅读全文 »

理解AIDL

发表于 2017-05-25 | 分类于 Android
public static com.example.pj.testingexample.IHelloService asInterface(android.os.IBinder obj)
{
    //obj为在客户端创建的Binder对象,可与Service端通信
    if ((obj==null)) {
        return null;
    }
    android.os.IInterface iin = obj.queryLocalInterface(DESCRIPTOR);
    if (((iin!=null)&&(iin instanceof com.example.pj.testingexample.IHelloService))) {
        return ((com.example.pj.testingexample.IHelloService)iin);
    }
    //返回一个代理类,代理类包含一个Binder对象,可向Service发起通信
    return new com.example.pj.testingexample.IHelloService.Stub.Proxy(obj);
}

Android纵向通信概览

发表于 2017-05-25 | 分类于 Android


TCP/IP传输模型

  TCP/IP协议的传输机制能给我们很大的启发,构造这个协议是自底向上的,底层提供接口,供上层调用。上层使用者只要给到符合接口的数据,便可跨层传输数据。当然,所有的层都是抽象出来的,数据最终的传递还是要靠物理层,但是呢,每一层都保存了对应的上下文信息,在层与层之间通信的时候,便不会出错。最后,所有的信息最后都是通过物理层出去的,以电信号的形式。

那么,这个理念搬移到Android的纵向通信中该怎么理解呢?    
阅读全文 »

Binder学习开篇

发表于 2017-05-25 | 分类于 Android

  研究Binder也有段时间了,最开始是囫囵吞枣,死记硬背,为了面试的需要,后面一直没用到这个技术,然后就忘记了。当某一天,你想看看源码的时候,你又会遇到Binder这个坎,然后你又去网上找些博客,速看,又记住了一些内容,可是,心里总是不踏实。

阅读全文 »

uCrop开源项目分析——核心业务

发表于 2017-05-25 | 分类于 Android

本文主要是对uCrop开源项目的核心业务逻辑分析

Github地址
中文说明

阅读全文 »

Bomb Head Analysis

发表于 2017-05-25 | 分类于 Android

在完成了StoreHouse动画分析之后,想进一步巩固View动画方法的知识,正好又看到了一个不错的gif动画,两者摩擦出了行动的火花,遂有此文。

阅读全文 »

uCrop开源项目翻译

发表于 2017-05-25 | 分类于 Android

###The uCrop Challenge

在开始写这个开源项目之前,我会事先定义一些特性,他们很好理解:

  • 裁剪图片
  • 支持任何裁剪比例
  • 支持手势缩放、平移和旋转
  • 在裁剪区域内不允许出现空白区域(剪切区必须是有效图片)
  • 创建一个随时可用的Activity,它可以使用Crop view。也就是说,这个开源库包含一个Activity,这个Activity包含一个Crop view和其他另外的组件
阅读全文 »
123
JackyPeng

JackyPeng

Let world be your playground

29 日志
4 分类
20 标签
Github
Links
  • 云雷兄
  • 我爱计算机
© 2017 JackyPeng
由 Hexo 强力驱动
主题 - NexT.Pisces