Android Metro风格的Launcher开发系列第三篇

前言:

各位小伙伴,又到了每周更新文章的时候了,本来是周日能发出来的,这不是赶上清明节吗,女王大人发话了,清明节前两天半陪她玩,只留给我周一下午半天时间写博客

,哪里有女王哪里就有压迫呀有木有!好了闲话少说,上一篇博客(Android Metro风格的Launcher开发系列第二篇)说到Launcher主体框架用ViewPager来实现,这一篇博客咱们来说说每一个page的具体实现。

PagerAdapter:

Launcher主体ViewPager实现就引出了PagerAdapter,PagerAdapter是android.support.v4包中的类,它的子类有FragmentPagerAdapter, FragmentStatePagerAdapter,这两个adapter都是Fragment的适配器,这里因为没有用到Fragment所以这里不讲,我只讲PagerAdapter。关于PageAapter的描述,Google官网原文是这样的:Base class providing the adapter to populate pages inside of a ViewPager. You will most likely want to use a more specific implementation of this, such as FragmentPagerAdapter or FragmentStatePagerAdapter,大致就是说PagerAdapter是ViewPager提供的一个适配器,方便我们对ViewPager的每一个View进行控制。我的PagerAdapter是这样实现的:

public class LauncherAdapter extends PagerAdapter {

private ArrayList<PageViewItem> mViews;

public LauncherAdapter(ArrayList<PageViewItem> views) {

mViews = views;

}

@Override

public void destroyItem(View arg0, int arg1, Object arg2) {

((ViewPager) arg0).removeView(mViews.get(arg1));

}

@Override

public void finishUpdate(View arg0) {

}

@Override

public int getCount() {

if (mViews != null) {

return mViews.size();

}

return 0;

}

public View getCurrentView(int currentID) {

return mViews.get(currentID);

}

@Override

public Object instantiateItem(View arg0, int arg1) {

((ViewPager) arg0).addView(mViews.get(arg1));

return mViews.get(arg1);

}

@Override

public boolean isViewFromObject(View arg0, Object arg1) {

return (arg0 == arg1);

}

@Override

public void restoreState(Parcelable arg0, ClassLoader arg1) {

}

@Override

public Parcelable saveState() {

return null;

}

}

PageViewItem:

PagerAdapter的getCurrentView方法返回的每一个view都是自定义View,为什么要自定义呢?因为在每一个图标获取焦点放大的时候会与旁边的图标有重叠部分,ViewPager每一页view都是一个FrameLayout,在绘制view的时候是按照一定的顺序绘制的,就会遇到焦点view放大后显示的效果是被旁边的view压了一部分,如果不改变view绘制顺序就不能避免这个问题。

如上图所示,图一显示效果就是焦点view放大,改变绘制顺序的实现效果。改变绘制顺序其实就是重写ViewGroup的getChildDrawingOrder(int childCount, int i)方法,每一次绘制时,最后返回focusview所在的viewgroup中的index就行了。

CellView:

如上图所示,每一个正方形的view我在这里叫做CellView,它也是一个自定义的view,自定义主要是为了实现:

1、获取焦点时放大和丢掉焦点时缩小效果,这里是应用了属性动画,ViewPropertyAnimator可以通过View的animate()方法获取的,具体动画实现如下:

mPropertyAnimator.scaleX((width + mScaleX) / width)

.scaleY((height + mScaleY) / height).setDuration(duration)

.setInterpolator(new DecelerateInterpolator())

.start();

2、在xml文件灵活配置一些CellView的属性,比如点击打开的应用,呈现的ICON获取地址,焦点x、y的放大值等,CellView对应的属性定义attrs.xml文件如下:

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

<resources>

<declare-styleable name="Launcher_ScaleView">

<attr name="parentID" format="integer" />

<attr name="resUrl" format="string" />

<attr name="resType" format="integer" />

<attr name="isRightEdge" format="boolean" />

<attr name="isLeftEdge" format="boolean" />

<attr name="isTopEdge" format="boolean" />

<attr name="isBottomEdge" format="boolean" />

<attr name="scaleX" format="integer" />

<attr name="scaleY" format="integer" />

<attr name="packageName" format="string" />

<attr name="activityName" format="string" />

<attr name="intentKey" format="string" />

<attr name="intentValue" format="string" />

<attr name="focusType" format="integer" />

</declare-styleable>

</resources>

3、实现在用遥控器移动焦点时不会焦点错乱,在开发遥控器应用时一个很大的问题就是焦点在移动时焦点错乱,基本上应用UI bug至少有一半时焦点bug,这个应用我为了防止焦点错乱定义了CellView的边界属性,上面的xml文件中isXXEdge就是,这样在焦点移动到边界时可以进行Page之间的切换和其他处理,防止焦点在进入每一个page时出现错乱。

下面来看一下实现的具体效果:

总结:以上就是Metro风格Launcher实现,我用了三篇博客来讲解这个应用,所有效果的实现都是自己摸索的,应该还有更好的实现方法,大家可以多多交流提出自己的看法,也可以关注我的微信号coder_online,以上谢谢!

原文发布于微信公众号 - 程序员互动联盟(coder_online)

原文发表时间:2015-04-07

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Android干货园

Base封装(一)--我的最简MVP架构

版权声明:本文为博主原创文章,转载请标明出处。 https://blog.csdn.net/lyhhj/article/details/73...

901
来自专栏何俊林

自定义 Behavior - 仿新浪微博发现页的实现

图:四川九寨沟 本文来自徐俊的独家投稿,徐俊的blog地址为:博客地址:http://blog.csdn.net/gdutxiaoxu/,点击【阅读原文】,可查...

35810
来自专栏何俊林

DragVideo,一种在播放视频时,可以任意拖拽的方案

前言:项目已开源到我的github,点击【阅读原文】可以对应github地址。 DragVideo A Method to Drag the Video Wh...

2537
来自专栏郭霖

Android多点触控技术实战,自由地对图片进行缩放和移动

在上一篇文章中我带着大家一起实现了Android瀑布流照片墙的效果,虽然这种效果很炫很酷,但其实还只能算是一个半成品,因为照片墙中所有的图片都是只能看不能点的。...

2085
来自专栏Sorrower的专栏

一起来做个拜年App吧!

592
来自专栏京东技术

【详解】Android Jetpack 新组件之Navigation的用法和源码结构分析

5年以上开发经验,对架构设计以及性能调优有着深刻认知,负责京东商城商品详情的开发,热衷于学习和创新。

1464
来自专栏Android开发指南

Android自定义控件总结

3077
来自专栏小筱月

Lily_music 网页音乐播放器 -可搜索(附歌词联动播放效果解说)

这是我今年(2018)年初的小项目,当时也是手贱,不想用别的播放器,想着做一个自己的网页播放器,有个歌曲列表、可关键词搜索、歌词滚动播放的效果,于是乎,就做了这...

1105
来自专栏向治洪

仿今日头条顶部导航效果

 之前发现很多人在群里面、论坛上求网易新闻客户端的源码,之后我就去下了个网易新闻客户端和今日头条新闻客户端,发现他们的大体是一样的,于是在最近的空闲时间,便去琢...

5918
来自专栏吴小龙同學

uCrop使用及源码浅析

uCrop使用 github地址 https://github.com/Yalantis/uCrop 然后clone或下载到本地,运行之。 效果预览 ? app...

3566

扫码关注云+社区