
Android干货分享
文章平均质量分 74
飞鸟_
积极、主动、正能量!!!
展开
-
Android单元测试
Android 单元测试: 首先,从是什么开始 Android单元测试(二):再来谈谈为什么 Android单元测试(三):JUnit单元测试框架的使用 Android单元测试(四):Mock以及Mockito的使用 Android单元测试(五):依赖注入,将mock方便的用起来 Android单元测试(六):使用dagger2来做依赖注入,以及在单元测试中的应用 Android单元...原创 2018-09-03 11:01:56 · 367 阅读 · 0 评论 -
滚动加载条效果
先上图: 效果也是比较简单的,直接上源码(具体步骤已经做了注释)package com.test.ndktest;import android.content.Context;import android.graphics.Canvas;import android.graphics.Color;import android.graphics.Paint;import android.gr原创 2017-09-27 12:54:01 · 383 阅读 · 0 评论 -
Android Proguard(混淆)
点击打开链接转载 2016-08-29 16:52:42 · 1360 阅读 · 0 评论 -
水波纹+旋转小球动画
实现效果:实现思路:1.首先绘制小圆的位置: 每个小圆的间隔为:2 * Math.PI / CIRCLE_COUNT 2.通过控制第一个小圆的角度变化,控制小圆的旋转。 通过控制大圆半径,实现小圆的聚合 3.水波纹实现:绘制一个空心圆,通过不断改变空心圆的半径和画笔宽度。代码实现:package com.test.paintdemo;import android.animation.An原创 2017-06-27 13:18:31 · 2351 阅读 · 0 评论 -
视频直播中的心形漂浮效果
实现效果:思路:1.首先要给心形图片创建一个平滑的悬浮路径,那就要用到贝塞尔曲线,这里采用自定义TypeEvaluator实现。 2.路径有了,就要考虑实现动画的两个步骤 a.缩放,伴随透明度变化 b.底部悬浮到顶部 这里是用的是Matrix 3.自定义View,然后绘制心形图片。 详细步骤,看源码代码:1.自定义BezierEvaluatorpackage co原创 2017-06-26 19:29:22 · 2292 阅读 · 0 评论 -
Jenkins+Tomcat + Gradle + Tinker + Walle + 360加固 + fir.im 持续集成,自动构建
先介绍一下为什么要用这么一大堆东西。。。。阶段一 开发了一个简单的app 每次打包只需要./gradlew assembleRelease,然后等待几分钟,就可以得到一个安装包。使用360加固助手进行加固然后将安装包上传到fir.im然后通知测试安装测试阶段二 为了更好的用户体验,使用了热修复tinker ./gradlew assembleRelease打包生成的安装包上传到360原创 2017-07-13 20:01:05 · 7169 阅读 · 14 评论 -
SVG
Android微信上的SVGSVG 即Scalable Vector Graphics 可伸缩矢量图形,这种图像格式在前端中已经使用的非常广泛了。 SVG的W3C的解释: http://www.w3school.com.cn/svg/svg_intro.asp矢量图像 SVG是W3C 推出的一种开放标准的文本式矢量图形描述语言,他是基于XML的、专门为网络而设计的图像格式,原创 2017-06-25 00:19:44 · 1732 阅读 · 0 评论 -
SVG绘制中国地图
效果如图,点击省份区域,即可蓝色高亮显示 实现思路:地图资源 Android SVG to VectorDrawable 1.首先获取SVG图片,然后将SVG转化为VectorDrawable,然后放入res/raw目录下(SVG图片代码在文章末尾) 2.通过DocumentBuilderFactory获取svg中的根节点rootElement 3.通过rootElement获取所有pa原创 2017-06-24 23:41:14 · 13224 阅读 · 0 评论 -
PathMeasure
PathMeasurePathMeasure是一个用来测量Path的类,主要有以下方法:构造方法 方法名 释义 PathMeasure() 创建一个空的PathMeasure PathMeasure(Path path, boolean forceClosed) 创建 PathMeasure 并关联一个指定的Path(Path需要已经创建完成)公共方法 返回值 方法名原创 2017-06-24 15:14:32 · 1412 阅读 · 0 评论 -
PathMeasure + 贝塞尔曲线实现过山车效果
先看效果图: 思路: 1.首先绘制红色的贝塞尔曲线 2.然后用PathMeasure,测量曲线某一点A的长度、倾斜度、坐标 3.根据坐标倾斜度,绘制图片 4.根据PathMeasure获得,起始点O到A点的路径,绘制走过的路径代码:package com.test.paintdemo.pathrelate;import android.animation.ValueAnimator;im原创 2017-06-24 14:38:14 · 3062 阅读 · 0 评论 -
Canvas模拟太阳地球月球的运动过程
先看效果图代码package com.test.paintdemo.pathrelate;import android.content.Context;import android.graphics.Bitmap;import android.graphics.BitmapFactory;import android.graphics.Canvas;import android.graphi原创 2017-06-23 14:41:53 · 4437 阅读 · 0 评论 -
Canvas
画线画一条直线: canvas.drawLine(0, 0, 100, 100, paint);画多条线: float []pts = {0,0,100,100,200,200,300,300}; canvas.drawLines(pts, paint);// 画虚线–也通过多条线的方式 画点画一个点: canvas.drawPoint(500, 500, paint);画多个点: fl原创 2017-06-22 15:45:04 · 1831 阅读 · 0 评论 -
Paint 全面解析
paint的方法分为两类:负责图形绘制、路径相关setStrokeWidth(float width)设置画笔宽度setStyle(Paint.Style style)设置画笔样式Style有三类: Paint.Style.FILL :填充内部Paint.Style.FILL_AND_STROKE :填充内部和描边Paint.Style.STROKE :仅描边、注意STROKE、FILL_原创 2017-06-20 14:40:44 · 4489 阅读 · 0 评论 -
自定义控件SearchView
先看张动图: 要实现的效果清楚了,接下来分析实现过程: 动画过程分为两个阶段: 阶段一:圆弧不断减小,直至消失,同时向右位移 阶段二:停止向右位移,AB1线段长度减少,同时CB2线段长度增加实现思路: 先画一个360度的圆弧,为了容易计算A、B1点坐标,先将画布逆时针旋转45度,再画弧度和AB1. 界面就变成: 圆心坐标(centerX, centerY)圆半径为Radius,则原创 2017-06-22 12:35:44 · 1268 阅读 · 0 评论 -
AndroidStudio buildgradle升级导致的兼容性问题
发现的问题: 1. app旧版本覆盖升级到新版本后,打开一直ANR甚至闪退。 2. 通过线上5个版本的覆盖升级比较,发现之前版本升级到最新版本都会有问题,需要清空一下数据,应用才能正常打开,否则一直ANR。 3. 安卓6.0版本,无影响。安卓4.4发现会有上述问题。 问题排查:(旧版本环境:2.1.3, 新版本环境:2.2.0) 1.首先看崩溃纪录,没有发现崩溃问题。 2.通过debug原创 2016-10-11 11:22:23 · 4069 阅读 · 0 评论 -
插件换肤
插件换肤的重点在于如何加载插件包的资源。 插件包其实就是一个apk的压缩包,加载插件包的资源,其实就是加载apk的资源。如何才能加载apk中的资源呢? 首先android中的各种资源都对应一个唯一id,比如获取一个view,通过findViewById(int id)方法,就可以得到布局的唯一view。 同样, 设置图片 setBackground(getResources().g原创 2017-11-17 20:11:35 · 400 阅读 · 0 评论 -
安卓知识汇总
1.Walle(瓦力,美团开源的)通过在Apk中的APK Signature Block区块添加自定义的渠道信息来生成渠道包,从而提高了渠道包生成效率,可以作为单机工具来使用,也可以部署在HTTP服务器上来实时处理渠道包Apk的升级网络请求。2.图片内存的计算 计算公式: 所占内存 = 图片长度 * 图片宽度 * 每个像素所占的内存 ALPHA_8:每个像素点占用1byte内存 ARG...原创 2018-03-06 13:51:27 · 501 阅读 · 0 评论 -
接下来的学习计划
11.1~2.15(除夕)学习概要:1.ffmpeg视频相关(源码编译、开发配置、图像编解码、音频处理、音视频同步播放)2.视频直播推流3.openCV图像识别4.热修复、插件化、增量更新5.RxJava、Glide、Retrofit原理6.kotlin7.android源码(老罗的Android之旅《安卓系统源代码情景分析》、《Android开发艺术探索》)安卓在线源码android/kerne...原创 2017-11-01 11:20:11 · 813 阅读 · 0 评论 -
搭建Maven私有仓库
1.Nexus官网 2.下载All platforms - Nexus Repository Manager OSS 2.x - bundle.zip 3.解压 4.运行 打开终端,转移到nexus2/bin目录下 运行:./nexus startbogon:bin lisen$ pwd/Users/lisen/Desktop/n2/nexus2/binbogon:bin l原创 2018-01-25 17:45:07 · 1689 阅读 · 0 评论 -
Sources for 'Android API 26 Platform' not found.[MAC]
比如是26找不到解决办法:1.找到以下路径,并打开文件~/Library/Preferences/AndroidStudioXXX/options/jdk.table.xml2.修改 修改后: 注:url的地址,需要根据自己的路原创 2016-07-22 13:08:21 · 7546 阅读 · 5 评论 -
Android开发艺术探索笔记之事件分发机制
View什么是ViewView是界面层控件的一种抽象,它代表一个控件。 ViewGroup继承自View,内部可以包含多个控件,即一组View。 View的位置参数 VelocityTracker 速度追踪VelocityTracker ve = VelocityTracker.obtain();在View的onTouchEvent方法中调用:ve.a原创 2018-01-15 11:31:51 · 521 阅读 · 0 评论 -
ijkplayer编译
ijkplayer安装homebrew、git、yasm# install homebrew, git, yasmruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"brew install gitbrew install yasm根据自己需要,进行如下设置If you原创 2017-12-04 15:14:39 · 1200 阅读 · 0 评论 -
代理模式
静态代理定义抽象接口 public interface IRequest{ void request(String params); }被代理类1 static class Retrofit implements IRequest{ @Override public void request(String params) {原创 2017-12-21 20:16:30 · 317 阅读 · 0 评论 -
替换dex实现热修复
安卓App热补丁动态修复技术介绍本文就是对上面的原理进行简单实现。 主要思想: 首先一个确保apk是由多个dex组成的,dex1、dex2、dex3等。 dex1一般会包含application等。假如dex2中出现了bug,那么我们可以修复相应的bug,生成对应的newdex2,然后将newdex2放置到dexements数组的前面。那么其他方法调用dex2中的方法时,会先从数组的由前往后遍原创 2017-12-04 19:31:13 · 1341 阅读 · 1 评论 -
Android跨进程通信
本文基于《Android开发艺术探索》,是一本不错的进阶书籍。多进程IPC(Inter-Process Communication):进程间通信或者跨进程通信,两个进程间进行数据交换的过程。 线程:CPU调度的最小单元。 进程:一个执行单元,比如一个程序活着应用。 一个进程可以包含多个线程。在Android中使用多进程的方法:在AndroidManifest.xml中指定android:pro原创 2017-12-12 17:01:46 · 818 阅读 · 0 评论 -
增量更新
实现思路实现增量更新的步骤: 1. old.apk和new.apk生成差异包patch 2. old.apk和patch合成更新包merge.apk 3. 安装merge.apk生成差异包patch1.进入bsdiff官网,下载bsdiff-4.3.tar.gz 2.解压下载好的bsdiff-4.3.tar.gz,然后编辑Makefile如下:CFLAGS += -O3 -lbz原创 2017-11-30 18:46:54 · 1822 阅读 · 0 评论 -
AndFix实现原理
AndFix不需要重启app即可实现bug修复,AndFix是“Android hot-fix”的缩写。AndFix实现步骤: 1.通过注解的生成补丁包(.apatch) 2.通过获取.apatch中的补丁类,然后通过注解方式获取需要打补丁的方法。 3.补丁中的方法替换bug中的方法。补丁包暂且不考虑,现在实现2、3步骤获取补丁包中要替换的方法新建项目,项目最终结构如下: 注解方法Methd原创 2017-12-01 16:44:31 · 2003 阅读 · 0 评论 -
RxJava源码分析(二)
这次聊的是RxJava的线程切换流程,先看一张图: 这个时序图对应的RxJava代码: public void demo2(){ createObservable() .subscribeOn(Schedulers.newThread())//被观察者在新线程执行subscribe .observeOn(Andr原创 2017-12-08 19:00:54 · 312 阅读 · 0 评论 -
RxJava源码分析(一)
RxJava官网快速入门,推荐下面大神整理的教程: 给初学者的RxJava2.0教程(一) 给初学者的RxJava2.0教程(二) ….. 给初学者的RxJava2.0教程(九)AndroidStudio配置: implementation 'io.reactivex.rxjava2:rxjava:2.1.7' implementation 'io.reactivex.rxja原创 2017-12-06 20:06:29 · 414 阅读 · 0 评论 -
java.lang.UnsatisfiedLinkError: dlopen failed: cannot locate symbol "strtof" referenced by "libsuppo
as更新到3.0以后,运行程序发现如下报错:11-15 13:24:22.849 10388-10388/com.test.nginxpush E/AndroidRuntime: FATAL EXCEPTION: main Process: com.test.ngi原创 2017-11-15 13:36:37 · 4584 阅读 · 0 评论 -
Activity源码浅析-DecorView
使用Activity,我们会先在onCreate方法中,设置setContentView public void setContentView(@LayoutRes int layoutResID) { getWindow().setContentView(layoutResID); initWindowDecorActionBar(); }getWin原创 2017-06-30 12:54:42 · 3254 阅读 · 0 评论 -
Tinker使用过程及注意点(2)-360加固及多渠道分包
本文根据以下文章整理Tinker接入指南 Android 多渠道打包梳理 walle 支持Android7.0 Signature V2 Scheme 多渠道打包,并解决类似360加固后获取不到渠道信息 - 渠道统计失败的问题步骤Tinker使用参考:Tinker使用过程及注意点 根据上文,假设我们现在获得了: 原始安装包:base.apk patch包:patch_signed_7zi原创 2017-05-11 19:44:30 · 3541 阅读 · 2 评论 -
【Android】RxJava + Retrofit完成网络请求
RxJava详解 Retrofit 2.0 的使用 RxJava的使用(一)基本用法 RxJava + Retrofit完成网络请求先看一个Demo: private void Demo1() { String[] a = {"" + R.mipmap.ic_launcher}; String[][] folders = {a, a}; L原创 2016-09-20 10:55:56 · 1784 阅读 · 0 评论 -
android与js的调用(WebView)
关于WebView的基本知识可以参考:点击打开链接WebSettings管理WebView的状态。WebView创建时,将会有一个默认的设置。通过WebView.getSettings()获取。如果WebView销毁后WebSettings的方法调用将发生异常。WebSettings的一些设置: WebSettings mWebViewSe原创 2016-08-25 17:06:18 · 2228 阅读 · 0 评论 -
Android中自定义视图View
点击打开链接转载 2016-09-06 15:08:24 · 1307 阅读 · 0 评论 -
RefreshRecyclerView下拉刷新,加载更多
ListView已经用了很多年了,后来又有了RecyclerView,基本可以代替ListView/GridView了,还有瀑布流的模式,加上各种特效,于是就尝试用RecyclerView替代listview。实际使用过之后发现,确实不错,但是还存在一些问题(比如卡顿)如果UI要求不严格,那么有一个很简单的方式实现下拉刷新:SwipeRefreshLayout (具体介绍参考:http://原创 2016-06-29 17:24:44 · 6196 阅读 · 0 评论 -
JNI编程(AndroidStudio)
先发一个链接:http://zhangleipku.blogspot.com/2016/03/test-ndk-jni-from.html 本文基本是基于上面的文章,在MAC下开发(Windows可能配置略有不同,请自行谷歌),接下来就写一下自己的过程,留个笔记。0.AndroidStudio->Project Structure->SDK Location->Android NDK原创 2016-06-27 17:29:19 · 1483 阅读 · 0 评论 -
Service, AIDL
先吸取别人的精华,有时间自己总结一下:点击打开链接转载 2016-09-05 16:44:11 · 1204 阅读 · 0 评论 -
断点续传
先上效果图: Activity:Notification:序列图:Created with Raphaël 2.1.0MainActivityMainActivityDownloadServiceDownloadServiceDownloadTaskDownloadTaskNotificationNotification启动/暂停service启动/暂停下载task广播通知下载进度更新notifi原创 2016-09-13 11:03:09 · 1625 阅读 · 0 评论 -
WindowManager仿网易严选加入购物车动画效果
关于WindowManager的介绍网上一大堆,这里只介绍一下具体的使用。详情可参考:点击打开链接此外还需要知道WindowManager.LayoutParams,参考介绍:点击打开链接案例是网易严选的加入购物车时,商品会移动并缩小进入购物车的动画效果。重要的三个方法是:addView() 添加View到Window removeView() 移除Viewupda原创 2016-08-10 16:03:26 · 3550 阅读 · 0 评论