将翻页效果做成一个View之在android中的View中实现装饰模式。
2013-04-14 17:29
495 查看
我想要让一个View 作为包装,但是其实体是一另外一个concrete View。让外界对装饰View的调用都换成对concreteView的调用。这样,就能够实现一个包装了。但是会遇到一个问题。就是很多函数是final的,比如findViewById(int id)。看下面的源码。
先把源码中的这两个函数的内容贴出来。
View.java中函数
/**
* Look for a child view with the given id. If this view has the given
* id, return this view.
*
* @param id The id to search for.
* @return The view that has the given id in the hierarchy or null
*/
public final View findViewById(int id) {
if (id < 0) {
return null;
}
return findViewTraversal(id);
}
ViewGroup.java中的源码:
/**
* {@hide}
*/
@Override
protected View findViewTraversal(int id) {
if (id == mID) {
return this;
}
final View[] where = mChildren;
final int len = mChildrenCount;
for (int i = 0; i < len; i++) {
View v = where[i];
if ((v.mPrivateFlags & IS_ROOT_NAMESPACE) == 0) {
v = v.findViewById(id);
if (v != null) {
return v;
}
}
}
return null;
}
注意,我们即使继承了ViewGroup 也是不能够调用findViewTraversal的。因为它是hide 函数。
而findViewById 函数是final 函数。我们不能够重载。但是我们可以从在findViewTraversal 函数,虽然该函数是hide的,但是能够重载它。其实很多时候,如果想调用hide 的函数,重载一下这个函数也是一个不错的办法。
看了源码,怎么重载该函数基本是没啥问题了。
protected View findViewTraversal(int id) {
Log.i(TAG,"my findViewTraversal");
if (id == getId()) {
return this;
}
return concrete.findViewById(id);
}
这样,在系统调用该函数的时候,就是调用这个重载的函数了。
另外提一句,系统在解析xml布局的时候,会不断地调用该函数,获得View。
额,此文未编辑完。未完待续...
先把源码中的这两个函数的内容贴出来。
View.java中函数
/**
* Look for a child view with the given id. If this view has the given
* id, return this view.
*
* @param id The id to search for.
* @return The view that has the given id in the hierarchy or null
*/
public final View findViewById(int id) {
if (id < 0) {
return null;
}
return findViewTraversal(id);
}
/** * {@hide} * @param id the id of the view to be found * @return the view of the specified id, null if cannot be found */ protected View findViewTraversal(int id) { if (id == mID) { return this; } return null; }
ViewGroup.java中的源码:
/**
* {@hide}
*/
@Override
protected View findViewTraversal(int id) {
if (id == mID) {
return this;
}
final View[] where = mChildren;
final int len = mChildrenCount;
for (int i = 0; i < len; i++) {
View v = where[i];
if ((v.mPrivateFlags & IS_ROOT_NAMESPACE) == 0) {
v = v.findViewById(id);
if (v != null) {
return v;
}
}
}
return null;
}
注意,我们即使继承了ViewGroup 也是不能够调用findViewTraversal的。因为它是hide 函数。
而findViewById 函数是final 函数。我们不能够重载。但是我们可以从在findViewTraversal 函数,虽然该函数是hide的,但是能够重载它。其实很多时候,如果想调用hide 的函数,重载一下这个函数也是一个不错的办法。
看了源码,怎么重载该函数基本是没啥问题了。
protected View findViewTraversal(int id) {
Log.i(TAG,"my findViewTraversal");
if (id == getId()) {
return this;
}
return concrete.findViewById(id);
}
这样,在系统调用该函数的时候,就是调用这个重载的函数了。
另外提一句,系统在解析xml布局的时候,会不断地调用该函数,获得View。
额,此文未编辑完。未完待续...
相关文章推荐
- 自定义View很简单 - Android翻页效果原理实现之模拟扭曲
- Android ViewPager实现左右滑动翻页效果
- android开发游记:viewpager关联tabs,自定义tabs实现翻页滚动效果
- Android自定义View——从零开始实现书籍翻页效果(二)
- Android自定义View之实现一个动态的文字闪动效果
- 2014-11-3Android学习------利用ViewFlipper实现滑动翻页的效果--------GIF动画实现
- Android下 一个自定义VIEW实现简单的弹幕效果
- android 自动划屏效果 在这里,我们需要用到google提到的一个包——android-support-v4.jar,这个包是为了方便实现android view之间的切换,关
- Android自定义View——从零开始实现书籍翻页效果(性能优化篇)
- Android_用SpannableString实现在同一个TextView中多风格的文字效果
- Android自定义View——从零开始实现覆盖翻页效果
- android ViewPager实现滑动翻页效果实例代码
- Android自定义View——从零开始实现书籍翻页效果(三)
- 自定义View很简单 - Android翻页效果原理实现之翻页的尝试
- 自定义View很简单 - Android翻页效果原理实现之引入折线
- Android自定义ViewPager实现纵向滑动翻页效果
- android中一个TextView实现其中内容大小颜色不同的效果
- Android自定义控件继承ViewGrop实现一个GridView的显示效果
- Android自定义View——从零开始实现书籍翻页效果(一)
- android开发之&使用ViewPager加gridView实现菜单按钮分页滑动(类似QQ表情选择翻页效果)