2017 春季最酷的 30 个 Android 库

这里是 30 个我最喜欢的在 2017 年 3 月前新出现的 Android 库。其中一些并没有用于实际产品,但你使用它们可能会得到很多的乐趣。我希望你们喜欢这些库。

下面的顺序不代表排名:

1.Matisse

这是一个漂亮的本地图片、视频选择器。其主要功能有:

  • 选择包括JPEG、PNG、GIF格式的图片和 MPEG、MP4 格式的视频
  • 支持自定义主题,包括两个内置的主题
  • 不同的图片加载器
  • 定义自定义过滤规则
  • 在 Activities 和 Fragments 中操作良好

你可以在代码库的 wiki 中发现更多。

2. Spruce Android Animation Library (安卓动画库)

Spruce 是一个轻量级的动画库,可以帮助排版屏幕上的动画。使用有很多不同的动画库时,开发人员需要确保每个视图都能够在适当的时间活动。 Spruce 可以帮助设计师获得复杂的多视图动画,而不是让开发人员在原型阶段就感到畏惧。

3. MaterialChipsInput

Chips 是 Material Design 中组件,他们被描述为

引用
小却相对复杂的个体,比如联系人。Chip 可以包含一些独立的东西,比如照片、文本、条款、图标或者联系人。

MaterialChipsInput 是在 Android 中实现的那个组件。这个库提供了两个视图:ChipsInputChipView.

4. Grav

该库允许基于点创建多个动画。 你可以很容易地制作出光滑美丽的动画。 README 包含很多示例,因此您可以在此处查看。

5. Litho

Litho 不是库,而是一个框架。它是一个非常强大的框架,以声明的方式构建 UI。它由 Facebook 的开发者开发,所以就算你不想使用它,它仍然值得你去关注它的开发过程。

主要特性包括:

  • 使用申明式 API  来定义 UI 组件。你只需要基于一套固定的输入来描述布局就好,其它事情框架会搞定。
  • 异步布局:Litho 可以在不阻碍 UI 线程的情况下计算并对 UI 布局。
  • 扁平化视图:Litho 使用 Yoga 来布局,并自动缩减 UI中 ViewGroups 的数量。
  • 细粒度回收:UI 中任何像 text 或 image 之类的组件都能被回收再利用。

6. Adaptable Bottom Navigation(自适应的底部导航)

不久前 Google 更新了 Material Design 的计划,介绍了底部导航栏,这是个在应用中让 UI 跟随内容变化的不错的方式。设计支持库(Design Support Library) 中也添加了实现。

用自适应底层导航替换支持库中的 BottomNavigationView 非常简单。它以 ViewPager 和 TabLayout 的工作方式来实现。这里有来自开发团队的一个简短说明:

引用
如前所述,使用 Android 支持库中的底部导航视图需要写很多无聊的的代码切换视图。因此,我们根据 TabLayout 的 setupWithViewPater() 方法,创建了独有特色的 ViewSwapper 组件连接到底层导航视图来以一个简单的方式对视图的显示进行管理。

你可以在 Github 中找到更多相关信息。对于为什么要实现这个东西,那里有详尽的资料和说明(提示:结构清晰)。

7. PatternLockView(图形锁视图)

引用
这个库让你可以在应用中简单快速的实现图形锁机制。这个视图真的是非常易用,它有大量的个性化选项可以用于改变功能和外观,以此满足你的需求。

 

引用
它还支持 RxJava 2 视图绑定,所以如果你喜欢响应式编程(就像我一样),你可以得到用户绘制图形的更新流。

README 中充满了示例,所以入门很容易。

8. Isometric

这是一个有助于绘制等轴形状的库。在我看来,它是本列表中最炫的库之一,因为它让我想起了 Monument Valley 游戏。
该库支持绘制多个形状、路径和复杂结构,如下面的示例:

9. UltraViewPager

UltraViewPager 是一个封装多种特性的 ViewPager ,主要是为多页面切换场景提供统一解决方案。

主要功能

  • 支持横向滑动/纵向滑动
  • 支持一屏内显示多页
  • 支持循环滚动
  • 支持定时滚动,计时器使用 Handler 实现
  • 支持设置 ViewPager 的最大宽高
  • setRatio 按比例显示 UltraviewPager
  • 内置 indicator ,只需简单设置几个属性就可以完成展示,支持圆点和 Icon;
  • 内置两种页面切换动效

该库有一个非常良好的文档。

10. InfiniteCards

可自定义动效的卡片切换视图,该库有助于实现卡片 UI ,然后用一个漂亮的动画切换它们。

参数

    • animType : 动效展示类型
    • front : 将点击的卡片切换到第一个

 

    •             switchPosition : 将点击的卡片和第一张卡片互换位置

 

                frontToLast : 将第一张卡片移到最后,后面的卡片往前移动一个

  • cardRatio : 卡片宽高比
  • animDuration : 卡片动效时间
  • animAddRemoveDelay : 卡片组切换时,添加与移出时,相邻卡片展示动效的间隔时间
  • animAddRemoveDuration : 卡片组切换时,添加与移出时,卡片动效时间

11. SlidingRootNav

我们可以认为这个库是像 DrawerLayout 的 ViewGroup,drawer(抽屉) 隐藏在内容视图之下,可以通过改变它们来显示 drawer。REAMDE 很全面,值得一看。

12. PasscodeView

这就是一个你可以键入密码的 view。但非常棒!

13. MusicWave

该库允许将声音表示为彩色梯度变化。

14. ShadowImageView

该库可帮助你为图片添加更有意义的阴影。根据 README ,它的作用是:

引用
可以根据图片内容变阴影颜色,更加细腻的阴影效果。

此外,它也非常易于使用。

15. PolygonDrawingUtil

这是一个高效的 Android 实用程序类,用于在 Canvas 上绘制常规的多边形。 我们可以指定:

  • 边数(≥3)
  • 中心点坐标
  • 外接圆半径(从中心到顶点的距离)
  • 圆角半径
  • 多边形旋转度
  • 填充/描边颜色

16. Tiny

这是本列表中的第二个框架。它负责图像压缩,功能相当强大的。还支持

引用
使用异步线程池来压缩图像,并且当压缩完成时,会将结果发送到主线程中。

 

17. ParticleTextView

该库提供了一个自定义的 view 组件,可以用彩色粒子组成指定的文字,并配合多种动画效果和配置属性,呈现出丰富的视觉效果。

18. CropIwa

这是一个高可配置的图像裁剪部件。该库基于模块化结构,因此它的可配置性非常强。你可以从 Github 上的 WiKi 了解如何进行配置。

19. Project Condom
『保险套』是一个超轻超薄的 Android 工具库,将它套在 Android 应用工程里裸露的 Context 上,再传入第三方 SDK(通常是其初始化方法),即可防止三方 SDK 中常见的损害用户体验的行为:

引用
在后台启动大量其它应用的进程(在三方推送 SDK 中较为常见),导致应用启动非常缓慢,启动后一段时间内出现严重的卡顿(在中低端机型上尤其明显)。 这是由于在这些 SDK 初始化阶段启动的其它应用中往往也存在三方 SDK 的类似行为,造成了进程启动的『链式反应』,在短时间内消耗大量的 CPU、文件 IO 及内存资源,使得当前应用所能得到的资源被大量挤占(甚至耗尽)。

20. AppMethodOrder

一个能让你了解所有函数调用顺序以及函数耗时的 Android 库(无需侵入式代码)。

引用
当项目代码量很大的时候,或者你作为一名新人要快速掌握代码的时候,给函数打上 log ,来了解代码执行逻辑,这种方式会显然成本太大,要改动项目编译运行,NO!太耗时;或者你想 debug 的方式来给你想关注的几个函数,来了解代码执行逻辑,NO!因为你肯定会漏掉函数;也许你可以固执的给你写的项目打满 log 说这样也行,但是你要知道你方法所调用的 jdk 的函数或者第三方 aar 或者 jar 再或者 android sdk 中的函数调用顺序你怎么办,还能打 log 吗?显然不行吧,来~这个项目给让可以让你以包名为过滤点过滤你想要知道所有函数调用顺序。

项目有详细的文件,你可以找到详细的手册了解如何使用它。

21. Android DebugKit

这是一个有趣的库。它允许你创建和使用特殊的悬停调试工具,以触发你在应用程序中定义的操作。这些操作可以在运行时明显的触发,因此可以在编写或测试手机屏幕反馈时间时使用。

该库使用 Builder 模式。 它很容易使用,在 README 中有一个其用法的示例。

22. Aesthetic

这是一个新的库,仍处于测试版,但它做了一件非常酷的事情 – 它通过 Rx 支持动态改变系统主题! 作者是这么描述的:

引用
一个快速和易于使用的即插即用的动态主题引擎。由 Rx 支持,适用于 Android 应用。

该库文档非常不错、内容全面,值得一读。

23. EasyCalendar

这是一个简单的自定义日历小插件。 主要功能包括:

  • 自定义布局的标题
  • 自定义布局的日期
  • 显示或隐藏日期的分隔符
  • 显示或隐藏溢出的日期
  • 监听日期视图的点击操作

该库的文档是全面且易于使用的。

24. SimpleRatingBar

该库提供两个评分栏:

  • BaseRatingBar – 没有任何动画
  • ScaleRatingBar – 具有渐进和缩放动画

你可以在下面的 gif 图中看到它们的效果:

25. Magellan

这个库被标榜为最简单的 Android 导航库,但你仍然需要自己判断它是否适合自己使用。主要特性:

  • 调用 goTo(screen) 方法就能简单实现导航,
  • 返回栈完全可控,
  • 自动处理过渡。

wiki 上有全面的说明。

26. ViewPagerAnimator

引用
ViewPagerAnimator 是一款面向 Android 的轻量级、功能强大的 ViewPager 动画库。 它被设计为在用户在 ViewPager 中的页面之间导航时显示任意动画,并且将精确地跟随他或她的手指的动作。虽然该库本身可能对某些人有用,但是发布这个库的主要目的就是展示一些完美 API 的细节之处,在使用即将到来的 Java 8 扩展时,这真的是走在前列的。本库还提供了 Java 7 和 Java 8 的示例项目。

它是由 Mark Allison 写的,你可以在他的 Styling Android 博客上获得更多的信息。

27. BlockCanaryEx

这是一个当你的应用程序被阻塞时,它可以方便在代码中找到阻塞的方法的库。它是基于 BlockCanary 的。

28. PaletteImageView

非常酷的一个库,可以动态的提取图片的主要颜色,并将颜色作为图片阴影的控件。

该项目文档较少,但我认为代码是不言自明的。

29. RecyclerRefreshLayout

这是一个打开相机快门的刷新动画。在我看来,真的值得研究,特别是在 README 中有一个关于如何实现这个效果的数学分析!

30. SlimAdapter

这是一种不使用 ViewHolder 来编写适配器的方法。主要功能包括:

  • 不包含 ViewHolders
  • 没有反射
  • 流畅和简单的 API
  • 支持多类型适配器
  • 支持 Kotlin
  • 支持简单的 DiffUtil

以上。希望你喜欢这篇文章! 如果还有在这个春天发布的其他伟大的库我没有提到,请在下面回复让我知道。 让我们一起维护这个列表!

英文原文:The 30 Coolest Android Libraries from Spring 2017
译者:Tocy, 边城, 王练, 总长, tsingkuo

20个帮助提高开发技巧的开源 Android App

学习的最好方法是阅读,对于开发人员也是如此。如果你想成为一个更好的开发人员,你必须阅读更多的代码。就这么简单。

书籍、博客、论坛在某种程度上都是不错的,但一些功能齐全的详解的开源项目依然是无可替代的,整个应用中包含的所有资源都展现在你面前。

所以你需要做的就是坐下来、喝杯咖啡、拜读下很棒的代码。在这篇文章中,我们提供了一些来自各种类别和风格的最好的开源 Android 应用程序,以满足你所有的学习和开发需求。

在深入代码之前,你可以直接从 Play Store 中试用这些应用程序。每个应用程序附带的难度级别将帮助你判断是否应该立即深入了解它或暂时放在一边。

LeafPic

(Github | Play Store | 难度: 入门级)

照片和视频画廊应用是安卓系统最常见的一种应用。有没有想过他们是如何制作的? LeafPic 是最好的开源画廊应用之一,你可以试着使用它学习。

它非常简单,容易理解,而且完全适合任何初学者开发人员。同时我发现这个应用最好的一件事情就是实现了动态主题。这是许多 Android 开发人员难以正确实现的。

Simple Calendar

(Github | Play Store | 难度: 入门级)

一个纯粹使用 Kotlin 开发的又简单又易用的日历应用。如果你想要学习 Kotlin ,这可能是最好的入门方法之一。

这个应用的目标非常简单,就是让你亲力亲为的通过开发 Android 应用来学习一门全新的语言。还有一件更酷的事情就是你能够学习到如何开发一个自定义的 Android 桌面工具。

Amaze File Manager

(Github | [ur=”https://play.google.com/store/apps/details?id=com.amaze.filemanager”l]Play Store[/url] | 难度: 中等)

一个非常常见的安卓文件管理器,你能在几乎所有安卓设备上使用它。

尽管开发一个文件管理器应用初步看起来很简单,但是实际上想要良好地运行在所有安卓平台和设备上是很难的。

从这个应用中你可以学到很多东西,尤其是怎么适当处理 SD 卡中的文件。但是我不建议你遵循这个项目中的编码标准,因为那是没法达到的。

Easy Sound Recorder

(Github | Play Store | 难度: 入门级)

一个简单的、容易使用的、漂亮的安卓录音应用。如果你想要学习一些关于安卓音频记录和操作方面的东西,那么这个项目最适合你了。

这个项目非常小(仅仅只有一个简单的 Activity ),同样也很容易理解。初学者可以从这个项目中学到原质化设计的基础知识。

MLManager

(Github | Play Store | 难度: 入门级)

MLManager 是一个简单直观的安卓设备应用管理器。如果你想要学习一些关于你设备上已安装应用的详细信息,或者是从这些应用中提取 APK 、卸载应用等,那么这个项目是你的理想选择。

这个应用中使用的编码标准很好,应该被遵守。而且遵循它的原质化设计原则,也能给你在设计干净简单的应用时提供一些好点子。

PhotoAffix

(Github | Play Store| 难度: 入门级)

这个一个设计很简洁的应用,它能够水平或垂直地拼接照片。是不是听起来很简单?确实如此。

对于任何想要学习安卓开发基础的初学者来说,这是一个理想的项目。它的编码标准是一流的,而且是我心中最好的开发实践。

通过这个项目你还可以学习实现一些简单有用的自定义视图,为你打好基础,以便将来设计更复杂的视图。

MovieGuide

(Github | 难度: 中等)

这个应用的功能相当简单,就是列出所有流行电影的预告片和评论,但是这个项目真正有趣的地方是它的实现方式。

这个应用展示了一些非常棒的开发项目,像 MVP、Bob 的 Clean Architecture、Dagger 2 实现的依赖注入,和 RxJava 。

这个应用程序非常简单,但实现方式非常棒,绝对值得一看。

AnExplorer

(Github | | Play Store | 难度级别:中等)

另一个简单、轻量级和简约的文件管理器,专为手机和平板电脑设计。

从这个项目中可以学到很多事情,比如文件处理、root权限管理、装载程序、自定义视图等。 它内部代码设计良好,你不需要花费太多时间来掌握其内部发生的事情。

Minimal ToDo

(Github | Play Store | 难度: 入门级)

对于一个初学者,这是一个可以用来试水的项目,它非常简单而且很酷。 通过这个项目您将有机会了解安卓开发的大部分基础。

作为初学者的良好起点,这个应用程序的设计是非常得体的。 但是不要遵循它的编码标准和打包结构,因为它们不符合标准,应该避免使用。

Timber

(Github | Play Store | 难易程度: 高级)

Timber 是一款设计精美、功能齐全的 Android 音乐播放器。如果你想要建立自己的音乐播放器或任何音乐相关的应用程序,那么这是你需要查看的项目。

该项目规模相当大,正处于密集开发状态。对于初学者来说,掌握所有代码可能会有点困难,但对于任何中级或高级 Android 开发人员来说,这应该是非常有趣的。

AnotherMonitor

(Github | Play Store | 难度等级: 中等)

如果你想了解如何监控 Android 进程、内存使用情况、CPU 使用情况以及与之相关的部分,那么这就是开始学习的完美项目。

它的规模比较小并且很容易理解,但编码规范、之后的架构和总体设计并不符合规范,不宜参考。

InstaMaterial

(Github | 难度: 入门级)

如果您正在寻找一个项目来学习或提高您的材料设计语言(Material Design)技能,那么这个很合适。 该项目试图用材料设计语言复制 Instagram 应用程序的部分内容。

在这个应用中使用了大量的材料设计语言元素、动画和过渡效果,您可以在自己的项目中学习和实现。

它非常简单,易于理解,非常适合任何想要提高设计技能的 Android 开发人员。

CoCoin

(Github | 难度级别: 简单)

CoCoin 是一个详尽的个人财务和记账解决方案,运行在一个干净漂亮的用户界面之上。

如果你想了解如何正确管理大量的用户数据,并从这些数据中绘制漂亮的图表,制作一些很酷的自定义视图,那么这个开源仓库就是为你而设的。

OmniNotes

(Github | Play Store | 难度: 中等)

如果您正在建立一个功能齐全的,类似 Evernote 笔记本的 Android 应用程序,那么用它开始是个正确的决定。

该项目有相当多的功能,如共享和搜索笔记、附加图像、视频、音频、草图、添加提醒功能等等。

您可以从这个项目中学到的另一件很酷的事情是将您的应用程序与 Google Now 无缝集成。

Clip Stack

(Github | Play Store | 难度级别: 入门级)

Android 上一个简单、干净和优美的剪贴板管理器应用。该项目相当小,同时简单易懂。

但是,本项目中所使用的包结构、架构、命名约定和编码规范并不符合标准。它是按照一个非常简单和初学者友好的方式来构建的。

Super Clean Master

(Github | 难度级别: 高级)

如果你曾使用过 Android 设备,那么肯定需要从设备中清理一些垃圾数据。 Clean master 是全球最受欢迎的选择之一。

这个应用程序,顾名思义,尝试以非常干净和优雅的方式模拟 Clean Master 的大部分功能。但整体项目有点复杂,可能需要花一点时间来理解所有的代码。

Travel Mate

(Github | 难度: 中等)

如果您正在寻找构建基于旅行的应用程序,并且需要大量依靠位置和地图,那么这个项目可能是最好的起点。

该应用程序的设计和代码质量尚未达到标准,但总体设计非常好,有很多东西值得一些初学者甚至中级 Android 开发人员来学习。

KISS

(Github | Play Store | 难度:中等)

一个简单、超快速、轻便的 Android 应用。可以从这个项目中学到的几个很酷很漂亮的功能。

所以如果你想制作 Android 的启动器,这可能是最好的开始。该应用程序相当小,并且该项目也是相当简单的。

Turbo Editor

(Github | Play Store | 难度: 中等)

一个简单但功能强大的 Android 编辑器应用程序。 您当然也可以使用此编辑器编写代码,并支持不同编程语言的语法高亮。

我甚至尝试打开大文本文件,大多数应用都崩溃或打开失败了,这个应用则相当优雅地处理了它们。 从这个项目,您将有机会学习制作一个非常可靠和强大的文本(或代码)编辑器应用。

Wally

(Github| 难易程度: 入门级)

Android 上快速、简单和高效的壁纸应用程序。这个项目有很多可学习的东西,尤其是对于初学者。

在应用中使用的架构相当不错,这使得该应用很容易扩展和维护。这个应用的目标非常简单,但是为实现这个目标而采取的方法是值得借鉴的。

Pedometer

(Github | 难易程度: 入门级)

一个简单、轻量级的计步器应用程序,它使用硬件传感器来计算步数,这对电池性能几乎没有什么影响。

这是一个开始学习步数跟踪的好项目,但是编码标准和设计不够好,不建议参考。

我已经分享了几种来自各种渠道的开源 Android 应用程序,以满足几乎所有人的需求。 还有适合各类 Android 开发者的应用程序,难度从入门级到更专业的。

我希望你会发现这些开源项目真的很有用。 本文最初发布在TechBeacon上。

译文:20+ Awesome Open-Source Android Apps To Boost Your Development Skills

JetBrains IntelliJ IDEA Ultimate 2006/ 2017.1.1 / 2017.1.2 Crack

How to crack

1.Install the latest version of IntelliJ IDEA (v2016 v2017.x.x)
2.Start it
3.When you have to enter the license, change to [License server]
In the Server URL input field enter: http://idea.strongd.net/ . For older Servers, check out the bottom of the page, they are all listed

4.Click on [Ok] and everything should

5 Steps to Take Care of Your MongoDB Performance

Do you face some performance issues in your MongoDB setup?

In this case follow these steps to provide some first aid to your system and gain some space for a long term architecture (such as Sharding).

Step 1: Enable Slow Queries

Get intelligence about your system behavior and performance bottlenecks. Usually there is a high correlation between the slow queries and your performance bottleneck, so use the following method to enable your system profiling collection:

db.setProfilingLevel(1, 100);

Step 2: Use Explain

Explore the problematic queries using explain. You can also use mtools to analyze the logged queries to find high frequent ones.

Step 3: Create Indexes

Your analysis should result with new indexes in order to improve the queries

Don’t forget to use index buildup in the background to avoid collections locking and system downtime.

Step 4: Use Sparse Indexes to Reduce the Size of the Indexes

If you use sparse documents, and heavily using the $exists key words in your queries, using sparse indexes (that includes only documents that includes your field) can minimize your index size the boost your query performance.

Step 5: Use Secondary Preferred to Offload Queries to Slaves

You probably have a replica set and it’s waste of resources not using your slaves for read queries (especially for reporting and search operations).

By changing your connection string to secondary preferred, your application will try to run read queries on the slaves before doing that on your master.

Bottom Line

Using these simple methods, you can gain time and space before hitting a wall.

How-To: Install Google’s Android Eclipse Plugin (And/or Adb) on 64-bit Debian/Ubuntu

Today I had to reinstall the Android plugin on my system and I recently upgraded to a 64-bit development VM. To my surprise the installation didn’t go smoothly at all. After restarting Eclipse twice I was constantly presented with two error messages “Failed to parse the output of ‘adb version’” and “adb: error while loading shared libraries: libncurses.so.5: cannot open shared object file: No such file or directory”. Your system may also present another error message that reads “adb: error while loading shared libraries: libstdc++.so.6: cannot open shared object file: No such file or directory”.

I could see that it was looking for libncurses.so.5 however I know that ncurses is already installed on my machine in /lib as /lib/libncurses.so.5. So where exactly was Eclipse/adb looking for it? It turns out that it wants to find its libraries in the /lib32 directory but you can’t just symlink it or you’ll get an error that reads “wrong ELF class: ELFCLASS64”. adb needs to have the 32-bit versions installed or it won’t function at all.

So to get up and running just run the following command to fix the issue:

sudo apt-get install lib32ncurses5 lib32stdc++6

After that just restart Eclipse and the issue should be fully put to bed. Let me know how it works out for you or if you run into trouble.

If you still run into trouble like an error message that reads “aapt: error while loading shared libraries: libz.so.1: cannot open shared object file: No such file or directory” you need to install the ia32-libs like this:

sudo apt-get install ia32-libs

Then rebuild your project and the errors should be gone.

UPDATE 2012-02-14: Rortian reports that the following command words on Fedora 16:

yum install ncurses-libs.i686 libstdc++.i686 libgcc.i686

免费的Android UI库及组件推荐

短短数年时间Android平台就已经形成了一个庞大而活跃的开发者社区。许多社区开发的项目业已进入成熟阶段,甚至可以用于商业的软件生产中,且不用担心质量问题。

本文编译自androiduipatterns,意在分享一些免费、开源的Android UI库及组件资源。

一、UI组件库

1. GreenDroid 

该项目可以实现下列的UI设计:

  • 动作栏(Action Bar)
  • 快捷动作(Quick Action)
  • 工作区(Workspace)
  • 动态列表(Dynamic List)

以及许多更有用的组件。

项目网站 / 示例

2. ActionBarSherlock 

在Google针对手机的动作条API推出前,该项目一直与ICS一起使用。Jake最近将项目拓展到了动作条之外。这里也有针对工作区等的组件。

项目网站 / 示例

3. Android Compatibility Package

这是一个来自Google Android库的官方扩展。Compatibility Package顾名思义就是Android官方针对旧平台版本所不支持的API或是Android Framework没有提供的函数库,将其打包发布。它包含了许多非常有用的API。该包同样包含工作区UI设计的实现。

项目网站

二、UI组件

1. iosched 

这是一个官方的Google I/O的应用(同样可用在GDD,Google Developer Day)(注:Google I/O是Google每年都会举办的历时两天的开发者大会,该大会谈及各种技术问题。开发人员会提供非常多的示例来展示他们的技术。这个项目专门为了这个会议提供了一个Android应用程序。)。该应用程序实现了大量的UI设计,成为Google Android设备拥护者的参考标准。强烈推荐使用该应用程序的仪表盘UI设计模式。(Google代码链接:Dashboard.java

项目网站:http://code.google.com/p/iosched/

2. Android-Viewflow 

该项目的工作区UI设计模式与Google Docs所使用非常相似。

项目网站:https://github.com/pakerfeldt/android-viewflow

3. android-coverflow 

该项目可以用于完成一个cover flow。在这个项目网站的视频中可以得到更多的信息。

项目网站:http://code.google.com/p/android-coverflow/

4. android-viewbadger 

该项目让devs无需修改布局文件(layout file)即可显示badges。

项目网站:https://github.com/jgilfelt/android-viewbadger

5. android-pulltorefresh 

该项目实现动态列表/下拉刷新(pull to refresh)的UI设计。

项目网站:https://github.com/johannilsson/android-pulltorefresh

6. Android-ViewPagerIndicator 

该项目可以用于实现工作区的UI设计。

项目网站/示例

VIA http://www.androiduipatterns.com/2011/10/free-android-ui-library-component.html

Android模拟器镜像文件介绍

. Android模拟器采用的是开源工程Qemu,Qemu是Linux 下的著名模拟器

2. kernel-qemu是内核镜像

3. ramdisk.img是文件系统,如果你自己编译了android的源代码,它的内容为
out/debug/target/product/generic/root,mount到android的/

4. system.img主要存放系统数据,android启动后mount到/system
它包含的内容为out/debug/target/product/generic/system

5. 一般来说我们不直接使用userdata.img,而是使用userdata_qemu.data,用来存放用户数据,可读写,android启动后mount到 /data。只有使用-wipe-data参数启动模拟器是时候才会用到userdata.img,它会使用userdata.img的内容覆盖 userdata-qemu.img
userdata.img的内容为out/debug/target/product/generic/system

6. 如果您没有编译android的源代码,我们也可以知道ramdisk.img、system.img和userdata.img的内容。
1). 查看ramdisk.img内容
terminal中进入sdk的images目录,执行file *


我看可以看到ramdisk是一个gzip文件,我们可以解压这个gzip文件,解压前先备份一下
然后在terminal中运行
localhost:images wuvincent$ gzip -d -S .img ramdisk.img
然后运行
localhost:images wuvincent$ file ramdisk
执行后会显示这个文件是一个cpio文件,于是我们可以把它解压到一个目录下,依次执行如下命令
localhost:images wuvincent$ mkdir ramdiskdir
localhost:images wuvincent$ cd ramdiskdir
localhost:ramdiskdir wuvincent$ cpio -idmv <../ramdisk
我们就可以进入ramdiskdir看到ramdisk.img的内容了。
其中最主要的几个文件时init init.rc init.goldfish.rc
2). 查看system.img和userdata-qemu.img內容
terminal中進入sdk的tools目錄下運行adb shell
localhost:tools wuvincent$ adb shell
adb server is out of date.  killing…
* daemon started successfully *
#
然後運行cd /和ls -l,執行結果如下:

 


我們可以看到ramdisk.img mount到/,init init.rc init.goldfish.rc都在/目錄下。
而/system就是system.img mount後的目錄,/data 就是userdata-qemu.img mount後的目錄,大家可以進入看看內容。

我們也可以在terminal中運行mount命令查看文件系統mount情況。

原文:http://www.devdiv.com/home.php?mod=space&uid=1&do=blog&id=1488

android:SQLite数据库 增、删、改、查

学习android开发不可避免的会涉及数据库的使用,android使用的是SQLite数据库。对于SQLite数据库的基本信息这里就不过多的介绍,我们主要看哈是怎么用的就是了。

与以往数据库不一样的地方

以前我们做javaWeb开发时用jdbc连接,现在变了,个人觉得变得简单了。在应用程序中直接就可以去创建数据库,然后对其进行操作。不用像以前写连接代码。

操作数据库

一,SQLiteOpenHelper 类

其中:

getReadableDatabase()得到可读的数据库,返回SQLiteDatabase对象,然后通过对象进行数据库操作。

getWritableDatabase()得到可写的数据库,返回SQLiteDatabase对象,然后通过对象进行数据库操作。

onCreate(SQLiteDatabase db)在第一次创建数据库时调用。

onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)在更改数据库时都会调用。

onOpen(SQLiteDatabase db)当数据库打开时调用。

close()关闭数据库。

二,SQLiteDatabase类

这个类提供了对数据库的一些基本操作:

insert()

delete()

update()

query()

。。。。。等等。

代码:

SQLiteOpenHelper 的子类:

  1. import android.content.Context;
  2. import android.database.sqlite.SQLiteDatabase;
  3. import android.database.sqlite.SQLiteDatabase.CursorFactory;
  4. import android.database.sqlite.SQLiteOpenHelper;
  5. /**
  6.  * 通过getReadableDatabase()和getWritableDatabase()可以获得数据库对象。
  7.  * 提供onCreate()-创建数据库时,onUpgrade()-升级数据库时,两个回调函数。
  8.  */
  9. public class DatabaseHelper extends SQLiteOpenHelper {
  10.     // 按要求必须要有构造函数
  11.     public DatabaseHelper(Context context, String name, CursorFactory factory,
  12.             int version) {
  13.         super(context, name, factory, version);
  14.     }
  15.     // 当第一次得到SQLiteDatabase对象时,调用该方法
  16.     @Override
  17.     public void onCreate(SQLiteDatabase db) {
  18.         String sql = “create table MSG(id int,body varchar(100))”;
  19.         db.execSQL(sql);
  20.         System.out.println(“创建了一个数据库!”);
  21.     }
  22.     // 当更新数据库时执行该方法
  23.     @Override
  24.     public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
  25.         System.out.println(“更新了数据库!”);
  26.         // 还可以写其他的操作
  27.     }
  28. }

有了这个类后,我们就可以对数据库进行增、删、改、查操作了。
插入数据:

  1. //生成ContentValues对象,key:列名,value:想插入的值
  2.                 ContentValues values = new ContentValues();
  3.                 values.put(“id”, 1);
  4.                 values.put(“body”, “hello”);
  5.                 DatabaseHelper dbhelper = new DatabaseHelper(SqliteActivity.this, “text_msg”, null, 2);
  6.                 //得到可写的SQLiteDatabase对象
  7.                 SQLiteDatabase db = dbhelper.getWritableDatabase();
  8.                 //调用insert方法,将数据插入数据库
  9.                 //参数1:表名
  10.                 //参数2:如果你想插入空值,那么你必须指定它的所在的列
  11.                 db.insert(“MSG”, null, values);
  12.                 System.out.println(“插入了:1, hello”);

删除数据:

  1. DatabaseHelper dbhelper = new DatabaseHelper(SqliteActivity.this, “text_msg”, null, 2);
  2.                 //得到可写的SQLiteDatabase对象
  3.                 SQLiteDatabase db = dbhelper.getWritableDatabase();
  4.                 //调用delete方法,删除数据
  5.                 db.delete(“MSG”, “id=?”, new String[]{“1”});
  6.                 System.out.println(“删除了:id=1”);

修改数据:

  1. ContentValues values = new ContentValues();
  2.                 values.put(“body”, “my dear!”);
  3.                 DatabaseHelper dbhelper = new DatabaseHelper(SqliteActivity.this, “text_msg”, null, 2);
  4.                 //得到可写的SQLiteDatabase对象
  5.                 SQLiteDatabase db = dbhelper.getWritableDatabase();
  6.                 //调用insert方法,将数据插入数据库
  7.                 //参数3:where 子句 “?”是占位符号,对应后面的”1”,这和web开发时的语法是一样的
  8.                 db.update(“MSG”, values, “id=?”, new String[]{“1”});
  9.                 System.out.println(“更新了:hello–>my dear!”);

查询数据:

  1. DatabaseHelper dbhelper = new DatabaseHelper(SqliteActivity.this, “text_msg”, null, 2);
  2.                 //得到可读的SQLiteDatabase对象
  3.                 SQLiteDatabase db = dbhelper.getReadableDatabase();
  4.                 //参数1:表名
  5.                 //参数2:要想显示的列
  6.                 //参数3:where子句
  7.                 //参数4:where子句对应的条件值
  8.                 //参数5:分组方式
  9.                 //参数6:having条件
  10.                 //参数7:排序方式
  11.                 Cursor cursor = db.query(“MSG”, new String[]{“id”,”body”}, “id=?”, new String[]{“1”}, null, null, null);
  12.                 System.out.println(“查到的数据为:”);
  13.                 while(cursor.moveToNext()){
  14.                         int id = cursor.getInt(cursor.getColumnIndex(“id”));
  15.                         String name = cursor.getString(cursor.getColumnIndex(“body”));
  16.                         System.out.println(“–>”+id+”::::::::::”+name);
  17.                     }

怎样使用adb查看数据库?

SQLite没有客户端,不能直接的查看数据库,所以用它提供的adb吧。

1,进入命令行后输入adb回车,会显示很多的信息。

2,输入adb shell回车,就进入了Linux命令行,现在就可以使用Linux的命令了。

3,ls回车,显示所有的东西,其中有个data。(ls:显示所有,cd:进入)

4,cd data回车,再ls回车,cd data回车,ls回车后就会看到很多的com.。。。的东西,那就是机器上的应用程序,找到你应用程序的包名,然后进入。

5,进去后在查看所有,会发现个databases,进入databases,显示所有就会发现你的数据库名字,我这里使用的是”text_msg”。

6,sqlite3 text_msg回车就进入了你的数据库了,然后“.schema”就会看到该应用程序的所有表及建表语句。

7,现在你就可以使用标准的SQL语句查看刚才生成的数据库及数据了。

对数据库的操作方法很多,这只是其中一种。

原文地址:http://blog.csdn.net/zzy916853616/article/details/6599898

Android 盘点所有Dialog 对话框 大合集 详解

雨松MOMO带大家盘点Android 中的对话框

今天我用自己写的一个Demo 和大家详细介绍一个Android中的对话框的使用技巧。


1.确定取消对话框

对话框中有2个按钮   通过调用 setPositiveButton 方法 和 setNegativeButton 方法 可以设置按钮的显示内容以及按钮的监听事件。

我们使用AlerDialog 创建对话框

  1. AlertDialog.Builder builder = new AlertDialog.Builder(MainDialog.this);

使用builder设置对话框的title button icon 等等

  1. builder.setIcon(R.drawable.icon);
  2.        builder.setTitle(“你确定要离开吗?”);
  3.        builder.setPositiveButton(“确定”, new DialogInterface.OnClickListener() {
  4.            public void onClick(DialogInterface dialog, int whichButton) {
  5.                //这里添加点击确定后的逻辑
  6.                showDialog(“你选择了确定”);
  7.            }
  8.        });
  9.        builder.setNegativeButton(“取消”, new DialogInterface.OnClickListener() {
  10.            public void onClick(DialogInterface dialog, int whichButton) {
  11.                //这里添加点击确定后的逻辑
  12.                showDialog(“你选择了取消”);
  13.            }
  14.        });
  15.        builder.create().show();

这个dialog用于现实onClick后监听的内容信息

  1. private void showDialog(String str) {
  2. w AlertDialog.Builder(MainDialog.this)
  3.      .setMessage(str)
  4.      .show();
  5. }

2.多个按钮信息框

  1. AlertDialog.Builder builder = new AlertDialog.Builder(MainDialog.this);
  2. builder.setIcon(R.drawable.icon);
  3. builder.setTitle(“投票”);
  4. builder.setMessage(“您认为什么样的内容能吸引您?”);
  5. builder.setPositiveButton(“有趣味的”, new DialogInterface.OnClickListener() {
  6.     public void onClick(DialogInterface dialog, int whichButton) {
  7.         showDialog(“你选择了有趣味的”);
  8.     }
  9. });
  10. builder.setNeutralButton(“有思想的”, new DialogInterface.OnClickListener() {
  11.     public void onClick(DialogInterface dialog, int whichButton) {
  12.         showDialog(“你选择了有思想的”);
  13.     }
  14. });
  15. builder.setNegativeButton(“主题强的”, new DialogInterface.OnClickListener() {
  16.     public void onClick(DialogInterface dialog, int whichButton) {
  17.         showDialog(“你选择了主题强的”);
  18.     }
  19. });
  20. builder.create().show();

3.列表框

这个数组用于列表选择

  1. final String[] mItems = {“item0″,”item1″,”itme2″,”item3″,”itme4″,”item5″,”item6”};
  1. AlertDialog.Builder builder = new AlertDialog.Builder(MainDialog.this);
  2.         builder.setTitle(“列表选择框”);
  3.         builder.setItems(mItems, new DialogInterface.OnClickListener() {
  4.             public void onClick(DialogInterface dialog, int which) {
  5.                 //点击后弹出窗口选择了第几项
  6.                 showDialog(“你选择的id为” + which + ” , ” + mItems[which]);
  7.             }
  8.         });
  9.         builder.create().show();

4.单项选择列表框

mSingleChoice 用于记录单选中的ID

  1. int mSingleChoiceID = -1;
  1. AlertDialog.Builder builder = new AlertDialog.Builder(MainDialog.this);
  2. mSingleChoiceID = -1;
  3. builder.setIcon(R.drawable.icon);
  4.     builder.setTitle(“单项选择”);
  5.     builder.setSingleChoiceItems(mItems, 0, new DialogInterface.OnClickListener() {
  6.         public void onClick(DialogInterface dialog, int whichButton) {
  7.                 mSingleChoiceID = whichButton;
  8.                 showDialog(“你选择的id为” + whichButton + ” , ” + mItems[whichButton]);
  9.         }
  10.     });
  11.     builder.setPositiveButton(“确定”, new DialogInterface.OnClickListener() {
  12.         public void onClick(DialogInterface dialog, int whichButton) {
  13.             if(mSingleChoiceID > 0) {
  14.             showDialog(“你选择的是” + mSingleChoiceID);
  15.             }
  16.         }
  17.     });
  18.     builder.setNegativeButton(“取消”, new DialogInterface.OnClickListener() {
  19.         public void onClick(DialogInterface dialog, int whichButton) {
  20.         }
  21.     });
  22.    builder.create().show();

5.进度条框

点击进度条框按钮后 开启一个线程计算读取的进度 假设读取结束为 100
Progress在小于100的时候一直在线程中做循环++ 只到读取结束后,停止线程。

  1.           mProgressDialog = new ProgressDialog(MainDialog.this);
  2.      mProgressDialog.setIcon(R.drawable.icon);
  3.      mProgressDialog.setTitle(“进度条窗口”);
  4.      mProgressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
  5.      mProgressDialog.setMax(MAX_PROGRESS);
  6.      mProgressDialog.setButton(“确定”, new DialogInterface.OnClickListener() {
  7.          public void onClick(DialogInterface dialog, int whichButton) {
  8.              //这里添加点击后的逻辑
  9.          }
  10.      });
  11.      mProgressDialog.setButton2(“取消”, new DialogInterface.OnClickListener() {
  12.          public void onClick(DialogInterface dialog, int whichButton) {
  13.              //这里添加点击后的逻辑
  14.          }
  15.      });
  16.      mProgressDialog.show();
  17.      new Thread(this).start();
  18. ic void run() {
  19. int Progress = 0;
  20. while(Progress < MAX_PROGRESS) {
  21. try {
  22.     Thread.sleep(100);
  23.     Progress++;
  24.     mProgressDialog.incrementProgressBy(1);
  25. } catch (InterruptedException e) {
  26.     // TODO Auto-generated catch block
  27.     e.printStackTrace();
  28. }
  29. }

6.多项选择列表框

MultiChoiceID 用于记录多选选中的id号 存在ArrayList中
选中后 add 进ArrayList
取消选中后 remove 出ArrayList

  1. ArrayList <Integer>MultiChoiceID = new ArrayList <Integer>();
  1. AlertDialog.Builder builder = new AlertDialog.Builder(MainDialog.this);
  2. MultiChoiceID.clear();
  3. builder.setIcon(R.drawable.icon);
  4.     builder.setTitle(“多项选择”);
  5.     builder.setMultiChoiceItems(mItems,
  6.             new boolean[]{false, false, false, false, false, false, false},
  7.             new DialogInterface.OnMultiChoiceClickListener() {
  8.                 public void onClick(DialogInterface dialog, int whichButton,
  9.                         boolean isChecked) {
  10.                    if(isChecked) {
  11.                        MultiChoiceID.add(whichButton);
  12.                        showDialog(“你选择的id为” + whichButton + ” , ” + mItems[whichButton]);
  13.                    }else {
  14.                        MultiChoiceID.remove(whichButton);
  15.                    }
  16.                 }
  17.             });
  18.     builder.setPositiveButton(“确定”, new DialogInterface.OnClickListener() {
  19.         public void onClick(DialogInterface dialog, int whichButton) {
  20.             String str = “”;
  21.             int size = MultiChoiceID.size();
  22.             for (int i = 0 ;i < size; i++) {
  23.             str+= mItems[MultiChoiceID.get(i)] + “, “;
  24.             }
  25.             showDialog(“你选择的是” + str);
  26.         }
  27.     });
  28.     builder.setNegativeButton(“取消”, new DialogInterface.OnClickListener() {
  29.         public void onClick(DialogInterface dialog, int whichButton) {
  30.         }
  31.     });
  32.    builder.create().show();

7.自定义布局


讲到自定义布局我就得多说一说了,为什么要多说一说呢?
其实自定义布局在Android的开发中非常重要 因为它能让开发者做出自己五彩缤纷的Activity 而不用去使用系统枯燥的界面。

自定义dialog有什么好处?

比如我们在开发过长当中 要通过介绍系统发送的一个广播弹出一个dialog . 但是dialog必需是基于activity才能呈现出来 如果没有activity 的话 程序就会崩溃。所以我们可以写一个自定义的 dialog 把它定义成一个activity
这样我们收到一条打开dialog的广播后 直接启动这个 activity  程序正常运行~~

这就是自定义dialog的好处。

注明:下面这个例子只是写了自定义dialog 没有把它单独的写在一个activity中 如果须要的话 可以自己改一下。

  1. AlertDialog.Builder builder = new AlertDialog.Builder(MainDialog.this);
  2.  LayoutInflater factory = LayoutInflater.from(this);
  3.  final View textEntryView = factory.inflate(R.layout.test, null);
  4.      builder.setIcon(R.drawable.icon);
  5.      builder.setTitle(“自定义输入框”);
  6.      builder.setView(textEntryView);
  7.      builder.setPositiveButton(“确定”, new DialogInterface.OnClickListener() {
  8.          public void onClick(DialogInterface dialog, int whichButton) {
  9.          EditText userName = (EditText) textEntryView.findViewById(R.id.etUserName);
  10.          EditText password = (EditText) textEntryView.findViewById(R.id.etPassWord);
  11.          showDialog(“姓名 :”  + userName.getText().toString()  + “密码:” + password.getText().toString() );
  12.          }
  13.      });
  14.      builder.setNegativeButton(“取消”, new DialogInterface.OnClickListener() {
  15.          public void onClick(DialogInterface dialog, int whichButton) {
  16.          }
  17.      });
  18.    builder.create().show();
  1. <span style=”color:#000000;”><?xml version=”1.0″ encoding=”utf-8″?>
  2. <RelativeLayout xmlns:android=”http://schemas.android.com/apk/res/android”
  3. android:layout_height=”wrap_content”
  4. android:layout_width=”wrap_content”
  5. android:orientation=”horizontal”
  6. android:id=”@+id/dialog”>
  7. <LinearLayout
  8. android:layout_height=”wrap_content”
  9. android:layout_width=”wrap_content”
  10. android:orientation=”horizontal”
  11. android:id=”@+id/dialogname”>
  12. <TextView android:layout_height=”wrap_content”
  13.    android:layout_width=”wrap_content”
  14.   android:id=”@+id/tvUserName”
  15.   android:text=”姓名:” />
  16. <EditText android:layout_height=”wrap_content”
  17.   android:layout_width=”wrap_content”
  18.   android:id=”@+id/etUserName”
  19.   android:minWidth=”200dip”/>
  20. </LinearLayout>
  21. <LinearLayout
  22. android:layout_height=”wrap_content”
  23. android:layout_width=”wrap_content”
  24. android:orientation=”horizontal”
  25. android:id=”@+id/dialognum”
  26.  android:layout_below=”@+id/dialogname”
  27. >
  28.   <TextView android:layout_height=”wrap_content”
  29.    android:layout_width=”wrap_content”
  30.   android:id=”@+id/tvPassWord”
  31.   android:text=”密码:” />
  32. <EditText android:layout_height=”wrap_content”
  33.   android:layout_width=”wrap_content”
  34.   android:id=”@+id/etPassWord”
  35.   android:minWidth=”200dip”/>
  36.  </LinearLayout>
  37.   </RelativeLayout></span>


8.读取进度框

显示一个正在转圈的进度条loading

 

  1. mProgressDialog = new ProgressDialog(this);
  2.  mProgressDialog.setTitle(“读取ing”);
  3.  mProgressDialog.setMessage(“正在读取中请稍候”);
  4.  mProgressDialog.setIndeterminate(true);
  5.  mProgressDialog.setCancelable(true);
  6.  mProgressDialog.show();

最后如果你还是觉得我写的不够详细 不要紧我把源代码的下载地址贴出来 欢迎大家一起讨论学习 雨松MOMO希望可以和大家一起进步。

15 Best Free Android Games You Love To Play

Android is open sources OS (operating System) for smart phones. Google’s mobile platform, the second most popular operating system using smart phones. Android has a big library of free apps and its growing day by day. Android Market has a big collection of free apps and free games, Android gaming market is also growing as well. So today we come with some best Android games for free download, you would love playing.

Our Last article, related to games appreciated by our readers a lot- best Linux 3D Games For free to use. And again this time we catch best android games for free to use. if you have Android phone then you must try these free Android games for kill free time and having fun.

I have been searching free games for android to make a best list for Android platform users. And finally i got the best list of free games for Android smart phones for having fun and enjoy. These games are the latest version of year 2011.

 

I hope Android platform users whom loves to play games on their smart phones will love to use these free android games. here we have listed 15 best free android games you love to play. You can share your views in our comment section below.

1. Bubble Blast 2

2. Angry Birds


3.  Yoo Ninja

4. Paradise Island

5. Drag Racing

6. Unblock Me

7. Mouse Trap

8. Paper Toss

9. Ant Smasher

10. iRunner

11. SpeedX

12. Air Control

13. Speed Anatomy

14. Aporkalypse Free

15. Math Maniac