- 博客(66)
- 资源 (12)
- 收藏
- 关注
原创 android6.0权限适配RxPermissions
1.直接获取权限(使用Retrolambda使代码更加简洁,当然并不是必须使用):// 必须在初始化阶段调用,例如onCreate()方法中RxPermissions.getInstance(this) .request(Manifest.permission.CAMERA) .subscribe(granted -> { if (grante
2017-03-31 23:56:50 982
原创 Android 7.0 FileProvider
Android 7.0 设备已经逐渐普及了。然而和 6.0 系统的 运行时权限 类似, Google 又针对这个版本做了一些出于安全性考虑的改动。如果针对 24+ 的 SDK 版本 进行开发,你不得不做一些适配工作。FileProvider是 Android 7.0 新增的一个类,位于 v4 包下,继承自四大组件之一的 ContentProvider ,因此需要 在清单配置文件里注册。
2017-03-31 23:54:47 1333
原创 图片压缩
android 系统的图片压缩大体上有三种方式,质量压缩,比例压缩,采样率压缩质量压缩public static Bitmap getCompressBitmapByQuality(Bitmap bitmap, int quality) { ByteArrayOutputStream outputStream = new ByteArrayOutputSt
2017-03-31 23:50:33 563
原创 升级安装APK兼容Android7.0,解决FileUriExposedException
我们在开发app时避免不了需要添加应用内升级功能。当app启动时,如果检测到最新版本,将apk安装包从服务器下载下来,执行安装。安装apk的代码一般写法如下,网上随处可以搜到public static void installApk(Context context, File file) { Intent intent = new Intent(Intent.ACTION_VI
2017-03-28 17:44:34 23462 1
原创 TabLayout属性介绍
1.什么是TabLayoutTabLayout提供了一个水平的布局用来展示Tabs。使用时直接引用design库compile 'com.android.support:design:25.1.0'在清单文件中设置如下代码即可:android:theme="@style/Theme.AppCompat"2.TabLayout的基本使用方式在布局中加入该控
2017-02-28 14:50:05 642
原创 微信支付踩坑之旅
前言,作为一名有经验的开发人员,竟然被集成微信支付这么一个小小的功能坑的吐血。文档不详细不够规范,Demo可以说是小学生写的吗,而且几年未更新了。。。虽然代码量很少,但是坑实在是多。一.客户端的坑在调用IWXAPI对象的registerApp()之前,我们需要先创建IWXAPI对象,那么这个对象该如何创建呢?Demo是这样写的:IWXAPI api = WXAPIFac
2017-01-23 01:14:26 1080
原创 Android中主流状态栏效果实现
Android在早期的系统版本中,状态栏是不支持修改的,所以打开任何应用程序会发现顶部的状态栏始终是黑条。在Android 4.4(KitKat)之后,系统的状态栏开始支持开发者定制和修改,包括显示或隐藏,更改颜色等(嗯,一定是抄袭ios的...),又在Android 5.0(LOLLIPOP)进行了改进。这样一来,我们就可以让系统状态栏跟随应用程序改变了。下面总结了市面上几种常见的Sta
2017-01-16 10:43:55 2081
原创 总结Android调用系统相机拍照遇到的坑
拍照功能在应用开发中几乎已成为标配,例如用户通过拍照上传头像。实现拍照功能的方式有两种。第一种是使用相机API(即Camera类)来自定义拍照,第二种是使用Intent调用系统相机来拍照。其中最常见的方式是直接调用系统相机拍照来获取照片。调用系统相机获取照片的流程如下,这里省去了声明权限和动态权限申请:private String mFilePath;// 需要初始化,路径自定义pr
2017-01-11 15:46:02 14241
原创 Android中的文件存储位置分析
应用开发过程中,避免不了需要使用到文件存储。Android在不同的系统版本中,对存储空间的使用限制会有所不同。如在6.0以上版本,对于外置存储空间的使用,需要动态申请权限,而6.0以下则不需要。不同的存储路径同样也会有区别。如内置存储空间无需权限申请可直接使用,而外置存储空间则可能会需要相应的权限。在存储文件或缓存数据时,我们需要尽量做到以下几点:(1).不要随意占用用户的内置存储。
2017-01-09 17:26:19 4333
原创 Android6.0动态权限分析
group:android.permission-group.CONTACTS permission:android.permission.WRITE_CONTACTS permission:android.permission.GET_ACCOUNTS permission:android.permission.READ_CONTACTS gr
2016-12-31 23:10:16 414
原创 实现WebView中点击图片显示大图
在新闻资讯app中,点击图片可以查看大图显示,如华尔街见闻。实现该功能,主要在于如何响应网页图片的点击事件,并获取到图片链接地址。而WebView里的交互操作,我们很容易想到使用Java与Javascript交互。好的,思路已经有了,为网页里的图片添加点击事件,在js里调用java代码,跳转到查看大图的页面,并将图片地址传递过去。下面,我们分三步来实现该功能。(1).创建Javas
2016-12-31 22:35:50 6472 4
原创 实现UC浏览器启动应用时引导用户开启存储空间权限
在Android6.0之前,需要声明权限时,我们只需在AndroidManifest.xml中声明即可。但是在Android6.0之后的版本中,我们除了需要在AndroidManifest.xml中声明之外,还需要在使用该权限时动态向用户申请,且只有当用户允许以后,才能够正常使用。如果我们的应用在使用过程中,必须要使用到外部存储空间,比如下载类、工具类应用,那么如何友好的引导用户开启存储空
2016-12-22 19:41:41 5730
原创 浅析Fragment中startActivityForResult()与getActivity().startActivityForResult()的异同
在Fragment类中启动另一个Activity并获取返回结果,可以使用this.startActivityForResult(),也可以使用getActivity().startActivityForResult()。那么,这两种方式有何异同呢?先来看一个示例。创建TestFragment类,继承自Fragment。添加一个按钮,点击后启动另一个Activity,重写Fragme
2016-12-06 18:13:31 2824 1
原创 微信登录、分享到微信
添加必要的权限支持: [1] 注册到微信要使你的程序启动后微信终端能响应你的程序,必须在代码中向微信终端注册你的id。(如下图所示,可以在程序入口Activity的onCreate回调函数处,或其他合适的地方将你的应用id注册到微信。[2] 发送请求或响应到微信现在,你的程序要发送请求或发送响应到微信终端,可以通过IWXAPI的 sendR
2016-11-30 23:37:31 797
原创 android 6.0权限判断
//判断是否开户相册权限 if (PackageManager.PERMISSION_GRANTED == ContextCompat.checkSelfPermission(context, android.Manifest.permission.CAMERA)) {
2016-11-30 23:15:41 2523
原创 WebView与JavaScript交互
settings.setJavaScriptEnabled(true);mWebView.addJavascriptInterface(new JavascriptInterface(), "android");mWebView.loadUrl(mUrl);class JavascriptInterface { @android.webkit.Javascri
2016-11-29 23:31:59 339
原创 使用Gson生成和解析json数据
Gson 是 Google 提供的用来在 Java 对象和 JSON 数据之间进行映射的 Java 类库。可以将一个 JSON 字符串转成一个 Java 对象,或者反过来。项目链接:https://github.com/google/gson示例代码:Gson gson = new Gson();int[] ints = {1, 2, 3, 4, 5};
2016-11-29 23:06:35 401
原创 设计模式之命令模式
定义将“请求”封装成对象,以便使用不同的请求、队列或者日志来参数化其他对象。命令模式也支持可撤销的操作。结构客户端(Client):创建一个具体命令(ConcreteCommand)对象并确定其接收者。命令(Command):声明了一个给所有具体命令类的抽象接口。具体命令(ConcreteCommand):定义一个接收者和行为之间的弱耦合;实现execute()方法,负责调
2016-10-31 00:11:21 321
原创 设计模式之适配器模式
适配器模式将一个类的接口,转换成客户期望的另一个接口。适配器让原本接口不兼容的类可以合作无间。现在,我们知道,这个模式可以通过创建适配器进行接口转换,让不兼容的接口变成兼容。这可以让客户从实现的接口解耦。如果在一段时间之后,我们想要改变接口,适配器可以将改变的部分封装起来,客户就不必为了应对不同的接口而每次跟着修改。一个适配器需要做多少“适配”的工作?如果我需要
2016-10-30 23:01:48 560
原创 设计模式之工厂模式
工厂方法模式定义了一个创建对象的接口,但由子类决定要实例化的类是哪一个。工厂方法让类把实例化推迟到子类。工厂方法模式能够封装具体类型的实例化。看看下面的类图,抽象的Creator提供了一个创建对象的方法的接口,也成为“工厂方法”。在抽象的Creator中,任何其他实现的方法,都可能使用到这个工厂方法所制造出来的产品,但只有子类真正实现这个工厂方法并创建产品。当只有一
2016-10-30 18:47:24 358
原创 设计模式之模板方法模式
定义:模板方法模式在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤。这个模式是用来创建一个算法的模板。什么是模板?模板就是一个方法。更具体的说,这个方法将算法定义成一组步骤,其中的任何步骤都可以是抽象的,由子类负责实现。这可以确保算法的结构保持不变,同时由子类提供部分实现。类图:
2016-10-30 17:52:02 376
原创 使用VerticalRollingTextView实现单行文字垂直滚动
VerticalRollingTextView是一个竖直方向无限循环滚动显示单行文本的控件。非常轻量级,直接继承View实现,使用Paint绘制文本,不依赖任何第三方。开源项目地址:https://github.com/shubowen/VerticalRollingTextView运行效果图: 一、项目使用(1).添加项目依赖。dependencie
2016-09-09 17:52:57 6513
原创 使用VerticalBannerView实现垂直轮播广告(仿淘宝头条)
VerticalBannerView是一个仿淘宝APP首页轮播头条的自定义控件。特性:1.可自由定义展示的内容。2.使用方式类似ListView/RecyclerView。3.可为当前显示的内容添加各种事件,比如点击打开某个页面等。VerticalBannerView开源项目地址:https://github.com/guojunustb/VerticalBannerV
2016-09-08 20:15:03 8285 7
原创 管理状态栏和导航栏
系统栏(system bar)是用来显示通知、设备状态和导航的屏幕区域。一般来说,系统栏(system bar)包括状态栏(status bar)和导航栏(navigation bar),它们与应用程序同时显示在屏幕上。而相册、视频等沉浸式的应用可以淡化系统栏来创造一个更加专注的体验环境,甚至是完全隐藏系统栏。下面来介绍如何在不同的版本中淡化和隐藏系统栏,营造一个沉浸式的用户体验,同时还可
2016-09-08 14:52:57 2878
原创 HandlerThread类的使用和分析
概述HandlerThread继承自Thread类,本质上还是Thread。与普通Thread的区别在于,它在创建一个线程的同时也创建了一个绑定该线程的消息循环,可以在当前线程中分发和处理消息。Handy class for starting a new thread that has a looper. The looper can then be used to create ha
2016-09-06 18:16:53 2784
原创 浅析Handler引起的内存泄漏及解决方法
在进行异步操作时,我们经常会使用到Handler类。最常见的写法如下。public class MainActivity extends Activity { ...... private Handler mHandler = new Handler() { @Override public void handleMessage(Message
2016-09-06 11:52:12 6477 1
原创 性能优化之布局优化篇二 使用<merge>标签
一、概述在xml布局文件中,多余的布局节点和嵌套会导致解析变慢。使用标签可以减少视图层级的嵌套,达到布局优化的效果。什么情况下需要考虑使用Merge标签呢?1.一个布局文件需要被添加到另一个父布局中(可以在xml中使用添加,或在java代码中使用inflate()添加)时,可以使用merge作为该布局的根节点。这样,当被添加进父布局时根节点会自动被忽略,所有的子节点直接被添加到
2016-09-05 15:02:50 4317
原创 性能优化之布局优化篇一 使用ViewStub视图
一、概述ViewStub是一个不显示且不占用布局空间的视图。ViewStub需要指定一个布局layout,在ViewStub初始化时,其指定的layout并未初始化。只有当ViewStub的setVisibility(VISIBLE/INVISIBLE)或inflate()方法被调用,ViewStub所指向的布局layout才会实例化,该layout会使用ViewStub的布局参数Layout
2016-09-02 19:28:38 3121 2
原创 selector的使用及执行流程
selector是Android中的背景选择器。一个selector使用几个不同的drawable来表示相同的图形,根据对象的状态来决定使用哪一个drawable。比如,一个按钮可以有不同的状态,默认状态、被按下的状态。官方文档:https://developer.android.com/guide/topics/resources/drawable-resource.html
2016-09-02 00:42:17 3540
原创 ImageView的ScaleType详解
ScaleType表示ImageView的缩放类型,决定了一张图片在ImageView控件内如何缩放和显示。ScaleType的官方文档:https://developer.android.com/reference/android/widget/ImageView.ScaleType.htmlScaleType可以使用java代码或xml属性来设置。Scale
2016-08-31 16:55:49 2181
原创 逐帧动画详解
概述逐帧动画(Frame Animation),是通过将一系列图片按照一定的顺序展示实现的动画。同是视图动画(View Animation),在使用时比补间动画(Tween animation)要简单很多。一、逐帧动画的使用(1).使用xml文件创建节点介绍::必须作为根元素,可以包含一个或多个元素。:代表一帧动画。属性介绍:android:oneshot:若等
2016-08-30 20:36:45 5510
原创 补间动画详解五 缩放动画ScaleAnimation
ScaleAnimation是尺寸变化动画的类,控制View的尺寸变化。ScaleAnimation类官方文档:https://developer.android.com/reference/android/view/animation/ScaleAnimation.html关于父类Animation的详解可参考文章:http://blog.csdn.net/ruancod
2016-08-29 23:35:15 34966
原创 补间动画详解四 平移动画TranslateAnimation
TranslateAnimation是平移动画的类,负责View的位移。TranslateAnimation类官方文档:https://developer.android.com/reference/android/view/animation/TranslateAnimation.html关于父类Animation的详解可参考文章:http://blog.csdn.net
2016-08-29 19:07:42 25324 1
原创 补间动画详解三 旋转动画RotateAnimation
RotateAnimation是旋转动画的类,用于控制View的旋转动作。RotateAnimation类官方文档:https://developer.android.com/reference/android/view/animation/RotateAnimation.html关于父类Animation的详解可参考文章:http://blog.csdn.net/ruan
2016-08-29 17:15:47 4055
原创 补间动画详解二 渐变动画AlphaAnimation
AlphaAnimation通过修改alpha属性,改变View的透明度,达到渐变的动画效果。AlphaAnimation类官方文档:https://developer.android.com/reference/android/view/animation/AlphaAnimation.html关于父类Animation的详解可参考文章:http://blog.csdn.
2016-08-29 11:02:33 2067
原创 补间动画详解一 基类Animation
补间动画(Tween animation)是通过在两个关键帧之间补充渐变的动画效果来实现的。Android系统提供了四个补间动画的类,分别是AlphaAnimation、RotateAnimation、ScaleAnimation和TranslateAnimation,另外还有一个能够把多个动画组合起来的AnimationSet类,这些类都有一个共同的基类Animation。Ani
2016-08-28 19:19:27 5288
原创 设计模式之装饰者模式
概述装饰者模式是在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能。它是通过创建一个包装对象,也就是装饰来包裹真实的对象。特点(1).装饰者和被装饰者对象有相同的超类型。(2).你可以用一个或多个装饰者包装一个对象。(3).既然装饰者和被装饰者对象有相同的超类型,所以在任何需要原始对象(被包装的)的场合,可以用装饰多的对象代替它。(4).装饰者可以在
2016-08-28 01:03:05 1734
原创 开源项目ToggleButton源码分析
ToggleButton是一个开关按钮。该项目未使用图片,使用绘制View的方式实现,且附带弹性效果。运行效果图:项目地址:https://github.com/zcweng/ToggleButton实现原理:按钮由分四部分绘制完成,如图所示。1.圆角矩形的边框。最大的一个RoundRect,按钮切换时颜色在灰色和绿色之间变换。2.圆角矩形。比上
2016-08-26 14:43:31 3072
原创 开源项目GridPasswordView使用和源码分析
GridPasswordView是一个密码输入视图,类似于微信或支付宝的支付密码视图。可以设置文字颜色和大小、分割线颜色、密码的长度。项目地址:https://github.com/Jungerr/GridPasswordView其中包含项目源码和示例代码。运行效果图:一、项目使用(1).在工程的build.gradle文件中添加项目引用。d
2016-08-23 12:36:07 6863 4
原创 使用ZXing扫描和生成二维码
ZXing是一个可以生成和解析多种格式的1D/2D条形码的开源类库,采用Java实现。Android和JavaSE可以集成使用。示例运行效果如下:网上流传的关于ZXing的代码库很多,但几乎都是很老的版本了。而ZXing一直在更新和优化,当前最新版本已经到3.2.1,我们可以在github上下载到最新的代码库。ZXing项目地址:https://github.com
2016-08-19 19:35:08 2468
Android使用PagerSlidingTabStrip实现顶部导航栏
2016-07-22
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人