前言:
PagerAdapter:
public class LauncherAdapter extends PagerAdapter {
public LauncherAdapter(ArrayList<PageViewItem> views) {
}
public void destroyItem(View arg0, int arg1, Object arg2) {
}
public int getCount() {
return mViews.size();
return 0;
public View getCurrentView(int currentID) {
}
public Object instantiateItem(View arg0, int arg1) {
return mViews.get(arg1);
}
public boolean isViewFromObject(View arg0, Object arg1) {
return (arg0 == arg1);
}
public Parcelable saveState() {
return null;
}
PagerAdapter的getCurrentView方法返回的每一个view都是自定义View,为什么要自定义呢?因为在每一个图标获取焦点放大的时候会与旁边的图片有重叠部分,ViewPager每一页view都是一个frameLayout,在绘制view的时候是按照一定的顺序绘制的,就会遇到焦点view放大后显示的效果是被旁边的view压了一部分,如果不改变view绘制顺序就不能避免这个问题。
如上图所示,图一显示就是焦点view放大,改变绘制顺序的实现效果。改变绘制顺序其实就是重写ViewGroup的getChildDrawingOrder(int childCount, int i)方法,每一次绘制时,最后返回focusview所在的viewgroup中的index就行了。
如上图所示,每一个长方形的view我在这里叫做CellView,它也是一个自定义的view,自定义主要是为了实现:
mPropertyAnimator.scaleX((width + mScaleX) / width)
.setInterpolator(new DecelerateInterpolator())
2、在xml文件灵活配置一些CellView的属性,比如点击打开的应用,呈现的ICON获取地址,焦点x、y的放大值等,CellView对应的属性定义attrs.xml文件如下:
<resources>
<attr name="parentID" format="integer" />
<attr name="resType" format="integer" />
<attr name="isLeftEdge" format="boolean" />
<attr name="isBottomEdge" format="boolean" />
<attr name="scaleY" format="integer" />
<attr name="activityName" format="string" />
<attr name="intentValue" format="string" />
</declare-styleable>
3、实现在用遥控器移动焦点时不会焦点错乱,在开发遥控器应用时一个很大的问题就是焦点在移动时焦点错乱,基本上应用UI bug至少有一半时焦点bug,这个应用我为了防止焦点错乱定义了CellView的边界属性,上面的xml文件中isXXEdge就是,这样在焦点移动到边界时可以进行Page之间的切换和其他处理,防止焦点在进入每一个page时出现错乱。
下面来看一下实现的具体效果:
总结:以上就是Metro风格Launcher实现,我用了三篇博客来讲解这个应用,所有效果的实现都是自己摸索的,应该还有更好的实现方法,大家可以多多交流提出自己的看法,也可以关注我的微信号coder_online,以上谢谢!
第一时间获得文章更新提醒,每天发布一篇技术大牛原创文章,更多技术信息分享,欢迎关注微信公众平台:程序员互动联盟(coder_online),搜索微信号coder_online即可关注,在线帮你解决技术难点,给大牛直接出难题!!!
