setWillNotDraw和setFillViewport

Romain Guy write a little info about a ScrollView attribute that is missing  from documentation : Android:fillViewport=”true” .

It must be set to ScrollView and has the following efect : when set to true, this attribute causes the scroll view’s child to expand to the height of the ScrollView if needed. When the child is taller than the ScrollView, the attribute has no effect.

当你想让一个高度值不足scrollview的子控件fillparent的时候,单独的定义android:layout_height="fill_parent"是不起作用的,必须加上fillviewport属性,当子控件的高度值大于scrollview的高度时,这个标签就没有任何意义了。

一.引言:

想必大家以前也遇到过这个问题:出于项目的需要,我们有时需要新建一个直接或者间接继承View的类,以便复写View提供的onDraw()方法,但有时我们反而得不到我们想要的结果,今天就说一下onDraw()方法不被执行的解决方法。你可能也在onDraw()方法里面设置了断点或log,却发现程序并没有执行onDraw()方法,那么你需要在你直接或者间接继承View的类的构造函数中加入下面的语句:

setWillNotDraw(false);

二.解释:

那么加这条语句的作用是什么?先看API:

If this view doesn‘t do any drawing on its own, set this flag to allow further optimizations. By default, this flag is not set on View, but could be set on some View subclasses such as ViewGroup. Typically, if you override onDraw(Canvas) you should clear this flag.

本人外语基础不是很好,简要翻译一下,如果翻译的不好,不要扔砖啊,重复一句我的语言:要想象,没有了想象,世界会是什么样。嘿嘿:

如果在当前的view上面不做任何的绘制操作,需要设置这个标记以便将来的更好的需要,默认的,这个标记在View里是不设定的。但是像View的一些子类如ViewGroup是可以设定的,典型的,你如果复写了onDraw(Canvas)方法,你需要清除此标记。

那么正好,我们所实现的就是View的子类:LinearLayout,当然你也可以继承其他的子类如:

AbsoluteLayout,AdapterView<T extends Adapter>,FrameLayout,LinearLayout,RelativeLayout,SlidingDrawer,子类就不说了,你可以自己去查文档。

这条语句要放在继承类的构造函数中,如:

[java] view plaincopy

  1. public classBackgroundLayout extendsLinearLayout {
  2. publicBackgroundLayout(Context context, intposition) {
  3. super(context);
  4. // TODOAuto-generated constructor stub
  5. setWillNotDraw(false);
  6. }
  7. @Override
  8. protected voidonDraw(Canvas canvas) {
  9. // TODOAuto-generated method stub
  10. super.onDraw(canvas);
  11. }
  12. }
  13. }

[java] view plain copy

  1. public classBackgroundLayout extendsLinearLayout {
  2. publicBackgroundLayout(Context context, intposition) {
  3. super(context);
  4. // TODOAuto-generated constructor stub
  5. setWillNotDraw(false);
  6. }
  7. @Override
  8. protected voidonDraw(Canvas canvas) {
  9. // TODOAuto-generated method stub
  10. super.onDraw(canvas);
  11. }
  12. }
  13. }

三,扩展看法:

eoeandroid上面Little关于这条语句的看法是:

设置view是否更改,如果开发者用自定义的view,重写ondraw()应该将调用此方法设置为false,这样程序会调用自定义的布局。

在此引用一下。

其实从这条语句的字面意思上可以看出:setWillNotDraw(false);就是设置将不绘画吗?你重写了onDraw()当然是要进行绘画了,所以应将此语句参数置为false.

时间: 2024-08-29 19:21:40

setWillNotDraw和setFillViewport的相关文章

android 上下左右都能滑动的是类似scorllview效果

上下左右都能滑动且带平滑效果的类似scorllview 代码:HVScrollView.java package com.yqy.yqy_frame.view; import java.util.List; import android.content.Context; import android.graphics.Rect; import android.os.Handler; import android.util.AttributeSet; import android.view.Foc

setWillNotDraw()方法使用

ViewGroup默认情况下,出于性能考虑,会被设置成WILL_NOT_DROW,这样ondraw就不会被执行了, 如果我们想重写一个ViewGroup的onDraw()方法,有两种方法: 1.构造函数中,给ViewGroup设置一个颜色; 2.构造函数中,调用setVillNOtDraw(false),去掉期WILL_NOT_DRAW flag,在ViewGroup初始化的时候,它调用了一个私有方法:initViewGroup,它里面会有一句setFlags(WILL_NOT_DRAW,DRA

Android -- setWillNotDraw()

干货 处理onDraw()方法不被执行的解决方法: setWillNotDraw(false); 官方文档的解释: If this view doesn't do any drawing on its own, set this flag to allow further optimizations. By default, this flag is not set on View, but could be set on some View subclasses such as ViewGro

选项卡导航开发viewpager + SlidingTabsLayout及SlidingTabsLayout的用法

从http://developer.android.com/intl/zh-cn/samples/SlidingTabsBasic/src/com.example.android.common/view/SlidingTabLayout.html下载SlidingTabsLayout的样例,主要类是:SlidingTabsLayout .SlidingTabStrip,将这两个类复制到项目中. SlidingTabsLayout的用法: 1. SlidingTabsLayout:对导航栏设置属性

Android淘宝电影日期滚动栏的实现

最近又有大片上映了,前几天刚看完<末日崩塌>,<侏罗纪世界>又来了,对于大片迷来说是一种福利,所以这几天手机上装了各种电影票团购软件,没办法,同样的电影同样的电影院同样的座位,但是不同的团购软件,价格就不一样.ok,言归正传 在淘宝电影上面有这样一个功能,日期可以滑动,并且选中的是在正中间,效果如下: 看完了,那么问题来了.这个功能怎么实现呢? 我们先来分析一下: 把功能拆分一下来看,如果不能滚动,是不是很好实现?其实就是一个 tab 栏,我在前面的 blog 中Android 快

仿网易新闻导航栏PagerSlidingTabStrip源码分析

转载请注明本文出自Cym的博客(http://blog.csdn.net/cym492224103),谢谢支持!   前言 最近工作比较忙,所以现在才更新博文,对不住大家了~!言归正传,我们来说说这个PagerSlidingTabStrip,它是配合ViewPager使用的导航栏,网易新闻就是用的这个导航,我们仔细观察这个导航栏不仅他是跟着ViewPager滑动而滑动,而且指示器还会随着标题的长度而动态的变化长度. · 下载地址: Github:https://github.com/astuet

CustomScrollVeiw(双向滑动)

/* * Integration of ScrollView and HorizontalScrollView * * For some unknown reason, the H/V scroll bar are missing. */ package com.k1.graphcode.ui.views; import java.util.List; import android.content.Context; import android.graphics.Rect; import and

Fragment利用ViewPager实现左右滑动--第三方开源--SlidingTabLayout和SlidingTabStrip实现

MainActivity: 1 package com.zzw.fragmentteb; 2 3 import java.util.ArrayList; 4 5 import android.graphics.Color; 6 import android.os.Bundle; 7 import android.support.v4.app.Fragment; 8 import android.support.v4.app.FragmentActivity; 9 import android.s

ViewPager实现页卡的3种方法(谷歌组件)

----方法一:---- 效果图: 须要的组件: ViewPager+PagerTabStrip 布局文件代码: <!--xmlns:android_custom="http://schemas.android.com/apk/res/com.pengkv.bigo"--> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layou