`
Cwuhao
  • 浏览: 1999 次
  • 性别: Icon_minigender_1
  • 来自: 北京
最近访客 更多访客>>
社区版块
存档分类
最新评论

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),扫一扫下方二维码或搜索微信号coder_online即可关注,我们可以在线交流。

                                                          

0
0
分享到:
评论

相关推荐

    Androidlauncher开发.pdf

    Android_launcher 开发概述 Android_launcher 是 Android 系统中的一個重要组件,负责管理用户的桌面环境。作为一个 GUI,它不仅需要提供对所有应用程序的映射,还需要具备良好的交互性和美观的界面设计。在 ...

    android手把手教你开发launcher(AndroidStudio版)

    知识点一:Android桌面启动器(Launcher)开发基础 在Android系统中,桌面启动器(Launcher)是用户与Android设备交互的起点,负责展示应用图标、列表和各种小部件。Android允许开发者创建自己的Launcher应用,可以...

    android手把手教你开发launcher.pdf

    Android Launcher 开发指南 Android Launcher 是 Android 操作系统中的桌面应用程序,负责管理桌面图标、widget 和其他桌面元素。下面我们将一步步指导您如何开发一个自己的 Launcher,並使其替代系统的默认 ...

    android 仿 windows metro 风格 源码

    在Android平台上,开发人员可以利用各种技术和库来实现独特的用户界面设计,其中之一就是仿照Windows Metro风格。"android 仿 windows metro 风格 源码"是一个专门用于创建类似Windows 8或Windows 10 Metro UI效果的...

    androidlauncher应用开发完整清晰版

    ### Android Launcher 应用开发知识点概述 #### 一、Launcher应用简介 Launcher是Android系统中的一个关键组件,它为用户提供了一个直观的操作界面,用于启动应用、管理应用图标、快捷方式等。简而言之,Launcher...

    Android 8.0 Launcher开发指南

    本指南将深入探讨如何在Android 8.0上进行Launcher的开发工作。 1. **Android 8.0 API更改** Android 8.0引入了一些重要的API更新,这对于Launcher开发者至关重要。例如,`AppShortcutManager`允许创建和管理快捷...

    android手把手教你开发launcher

    Android Launcher 开发教程 Android Launcher 是 Android 系统的桌面应用程序,负责显示应用程序列表、 Widget、快捷方式等内容。在本文中,我们将手把手教您开发一个简单的 Launcher 应用程序。 Launcher 的基本...

    Android 取消系统默认 launcher3的home属性,保证第三方的launcher正常使用.patch

    Android 取消系统默认 launcher3的home属性,保证第三方的launcher正常使用.patch

    Android11 Launcher3

    - **第三方启动器**:开发者可以通过修改Launcher3源代码创建第三方启动器,实现更多定制功能,如更多的过渡动画、自定义快捷方式等。 - **性能调优**:通过对代码的优化,可以减少Launcher3的启动时间和内存...

    Android_Launcher应用开发_示例代码.zip

    本资料包“Android_Launcher应用开发_示例代码.zip”提供了关于如何开发自定义Android Launcher的详细教程以及相关的示例代码,非常适合已经有一定Android基础并且希望进一步提升技能的开发者。 1. **Android ...

    Android launcher 开发博客集

    launcher 开发 在这里 我们继承了launcher 开发前人经验 一同学习

    android 自定义 模仿Launcher

    在Android开发中,自定义Launcher是一项常见的需求,它允许开发者创建独特的用户界面,提供与原生系统不同的启动器体验。本项目"android 自定义 模仿Launcher"旨在为平板和手机构建一个可自定义的启动器应用。由于...

    Launcher3_android原生launcher_

    - 用户还可以通过第三方应用或ADB命令修改Launcher3的XML配置,实现个性化定制。 5. **多窗口模式与手势操作**: - 虽然Android 5.1未正式引入多窗口功能,但Launcher3已经为后续版本打下了基础。 - 支持多种...

    Launcher3_androidlauncher_android开发_

    本主题将深入探讨如何开发一个自定义的Android Launcher,以"Launcher3"为例,它是Android开源项目AOSP(Android Open Source Project)中的默认启动器。我们将从基本架构、界面设计、功能实现和性能优化等多个角度...

    Android8.1_Launcher3.zip

    Android原生Launcher3源码的Android Studio版本,可以用AndroidStudio直接打开并开发。Android平台版本:Android8.1,AndroidStudio版本:3.3.2,注意:编译用到的com.google.protobuf编译信息不能更改,否则编译不过

    Android studio 编译Launcher 3

    Android Studio 是Google官方推荐的Android应用开发集成开发环境(IDE),而Launcher 3是Android系统中的默认桌面应用,负责管理应用图标、快捷方式和主屏幕。编译Launcher 3的过程涉及到Android的源码构建、Gradle...

    Android5.0 Launcher3源码

    - Android 5.0 支持通过第三方启动器替换默认的 Launcher3,这得益于 Android 的开放性和模块化设计。 - 开发者可以通过继承 Launcher3 并覆盖特定方法来实现自己的启动器功能,如更改布局、添加新特性等。 7. **...

    Android Launcher应用开发

    Android Launcher应用开发Android Launcher应用开发

    android launcher3源码 循环翻页

    本篇文章将深入探讨Launcher3的源码,特别是其循环翻页的实现原理,帮助开发者更好地理解和优化Android桌面应用。 首先,我们需要理解Launcher3的基本架构。Launcher3是一个Activity,它继承自PhoneWindowManager,...

    Launcher3原理及二次开发

    此资源是在安卓巴士交会上王鹏工程师分享的Launcher3的原理及二次开发pdf。文中介绍啦Launcher3的框架和主要流程,能给从事Lauuncher3开发和桌面定制的开发人员启迪。特此分享出来。

Global site tag (gtag.js) - Google Analytics