自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

feng海涛

长路漫漫,其修远兮。

  • 博客(59)
  • 资源 (4)
  • 收藏
  • 关注

原创 Android使用Opengl录像时添加(动态)水印

最近需要开发一个类似行车记录仪的app,其中需要给录制的视频添加动态水印。我使用的是OpenGL开发的,刚开始实现的是静态水印,后面才实现的动态水印。1、静态水印实现原理:录像时是通过OpenGL把图像渲染到GLSurfaceView上的,通俗的讲,就是把图片画到一块画布,然后展示出来。添加图片水印,就是把水印图片跟录制的图像一起画到画布上。这是加载纹理跟阴影的Java类package c...

2020-12-08 13:22:48 9225 76

原创 Android IPC(跨进程通信)之AIDL

Android IPC(跨进程通信)之AIDLIPC——跨进程通信,是指两个进程之间的数据交换过程。在说IPC的同时我们要知道什么是进程,什么是线程。线程是CPU调度的最小单元,进程可以理解为一个程序或者一个应用。一个进程中可以运行多个线程,而在Android程序中有一个主线程,也叫UI线程。在Android上,一个应用代表一个进程,当你运行应用的是时候,Android会为你分配一个独立的虚拟机,这也就相当于给你分配一块独立的内存,程序中使用的对象以及数据可以在这里共享的。但当你开启多进程时,这个进程的

2020-08-01 14:44:17 1989 2

原创 Android 控件背景实现发光效果

主要实现的那种光晕效果:中间亮,四周逐渐变淡的。这边有三种发光效果,先上效果图。

2023-11-02 14:53:00 658

原创 Google针对非 SDK 接口的限制

最近在项目中遇到一个问题,非系统签名应用预装到android sdk为28的系统vender或者system分区下,调用隐藏api时,程序崩溃。报错信息如下:主要原因在于: Accessing hidden method Landroid/view/RenderNode;>getClipToOutline(),不能访问隐藏的getClipToOutline()方法。预装到系统的应用为什么会受到这种限制呢?从 Android 9(API 级别 28)开始,Android 平台对应用能使用的非 SDK 接口实

2022-07-11 14:31:44 2887 1

原创 flutter编译报错解决

问题一:java.lang.AssertionError: annotationType(): unrecognized Attribute name MODULE (class com.sun.xxx)解决方法:将jdk8改为jdk11就可以。修改方法:在gradle.properties文件添加jdk路径。问题二:安装应用一直卡在Installing build/app/outputs/flutter-apk/app.apk…不动。解决方法:官方文档有解决方法,参考链接https://fl

2022-07-08 10:08:04 4440

原创 Paging3 分页库的使用

Paging3 分页库的使用及踩坑经历简介Paging 库可帮助您加载和显示来自本地存储或网络中更大的数据集中的数据页面。此方法可让您的应用更高效地利用网络带宽和系统资源。Paging库分为Paging2和Paging3,因为Paging2使用不太友好,这里着重介绍Paging3。使用Paging3的优势分页数据的内存中缓存。该功能可确保您的应用在处理分页数据时高效利用系统资源。内置的请求重复信息删除功能,可确保您的应用高效利用网络带宽和系统资源。可配置的 RecyclerView 适配器,

2022-05-17 16:01:43 1438

原创 Android ViewBinding使用及原理

Android ViewBinding使用及原理一、定义ViewBinding主要是Google用来findViewById的,作用跟Butterknife差不多。只不过Butterknife是通过扫描注解生成相应代码,而ViewBinding是通过扫描layout布局文件生成相应代码。而且ViewBinding是Google开发,深度集成在idea上。二、使用在模块build.gradle文件中添加配置:android { ... viewBinding{ ena

2022-01-05 16:25:50 4347

原创 Android 自定义水波纹扩散控件【kotlin】

Android 自定义水波纹扩散控件【kotlin】效果图:圆从中心开始扩散,在扩散过程中逐渐透明。实现思路:使用多个属性动画去控制。代码实现:package com.fht.kotlin.widgetimport android.animation.ValueAnimatorimport android.annotation.SuppressLintimport android.content.Contextimport android.graphics.*import androi

2021-12-29 09:52:00 488

原创 Android 实现图文混排

Android 实现图文混排需求:在文字中间添加图片或者在文字后面添加图片;文字换行后,图片在第二行的后面;图片加点击事件,文字没有点击事件。实现:使用TextView + Imageview实现,第1点好实现,第2点不好搞;自定义TextView实现;使用ImageSpan + TextView实现。今天说的是第三种实现:使用ImageSpan + TextView实现效果图:实现方法:Spannable.SPAN_EXCLUSIVE_EXCLUSIVE //前后都不包

2021-12-13 19:25:57 4540

原创 Android 自定义雷达扫描控件【kotlin】

Android 自定义雷达扫描控件【kotlin】效果图:首先我们要做的是分解当前的view设计,可以分为四个部分:中心绿色的小圆、外面浅绿色的大圆、大圆的阴影和扫描动画。我们刚开始实现的时候分步走,不要想着一次性就实现整个view。第一步:画中心绿色的小圆颜色 :绿色空心or实心:实心伪代码实现://定义画笔private val circlePaint = Paint() //中心圆圈画笔//定义半径private var circleRadius = 8f //中心圆圈半径/

2021-12-02 17:55:28 3245

原创 Android 自定义控件浅谈

Android 自定义控件浅谈在做自定义控件时,我们要清楚自定义控件有哪些,是怎么分类的,我们应该如何去选择?Android自定义控件主要分为三类:自定义控件,继承View或者ViewGroup类(重写onDraw方法,调用invalidate方法重新绘制View,譬如说计数器);组合控件(把系统现有的控件组合在一起,创建一个新的控件);自定义扩展控件,也就是继承现有的控件,在该控件的基础之上添加新的功能。(譬如继承Button,tablayout等)。如何去选择?我说一下我的理解,不对

2021-11-29 10:39:42 2029

原创 Android 反编译Apk修改资源文件并重新打包

Android 反编译Apk修改资源文件并重新打包​ 当前文章只是讲解如何修改资源文件再打包,Java文件修改暂时不支持。一 、工具介绍apktool : 用来反编译apk,以及重新打包;signapk.jar :用于签名,将重新打包的apk签名;Jadx-gui:用于查看源码,可以用其他查看源码的工具代替。二、工具使用apktool的使用将需要反编译的apk放到apktool工具的根目录。然后进入到apktool工具根目录,输入指令:apktool d -f [待反编译的ap

2021-11-01 16:58:25 5636

原创 无障碍服务AccessibilityService详解

无障碍服务什么是无障碍?为什么需要无障碍?让应用使用起来没有障碍。Android应用的目标是让所有人都可以使用,包括但不限于视力受损、色盲、听力受损、精细动作失能的人。要想这些有无障碍需求的用户有更好的体验,那么开发应用就要多考虑无障碍功能。Android无障碍服务无障碍服务是 Android框架的一项功能,旨在为了给使用Android设备的残障人士提供交互反馈,让他们能够更方便的使用Android设备。常见无障碍服务示例开关访问:允许行动不便的 Android 用户使用一个或多个开关与设备进

2021-09-14 15:22:45 15415 1

原创 Android 用广播监听home键

Android 用广播监听home键最近有需求要监听home,网上找了几个方法都不行,不知道是不是过时了。只有用广播监听的才可以,但是好像只能监听,不能拦截。1.新建广播类HomeKeyReceiver.java;import android.content.BroadcastReceiver;import android.content.Context;import android.content.Intent;import android.util.Log;/** * @author

2021-07-29 21:07:30 867

原创 ContentObserver监听系统属性变化

ContentObserver监听系统属性变化有时候我们需要监听系统属性变化,或者通过修改系统属性的值来通知其它应用做相应的操作。以无障碍服务的属性为例,通过ContentObserver监听其变化:Settings.Secure.ENABLED_ACCESSIBILITY_SERVICES1、新建MyContentObserver.java类继承ContentObserver;import android.database.ContentObserver;import android.os.H

2021-07-19 19:43:34 3330 1

原创 简单工厂方法设计模式

简单工厂方法设计模式场景:我要去图书馆看不同的书,图书馆相当于生产者,提供不同种类的书,我可以通过图书馆获得指定的书进行阅读。(1)先建一个抽象的产品类——书。书是用来阅读的,所以添加抽象方法read()。/** * 抽象产品类 */public abstract class IBook { /** * 抽象方法:阅读 */ public abstract void read();}(2)书有不同类型的,有Android的,有Java的,所以新建两个类继承

2020-11-23 17:30:53 239 1

原创 单例模式的六种写法

单例模式的六种写法重新回顾一下设计模式中的单例模式。单例模式就是保证一个类只有一个实例,并提供一个访问它的全局访问点。使用场景:整个项目需要一个共享访问点或共享数据。创建一个对象需要耗费的资源过多,比如访问I/O或者数据库等资源。工具类对象。单例模式有很多种写法,最常见有六种写法。1.饿汉式public class Singleton { //饿汉式 private Singleton(){} private static Singleton instance =

2020-11-20 15:26:34 1514 1

原创 Git常用命令使用

git常用场景命令使用场景一:git上创建远程仓库,没有添加任何文件1、在本地要上传的文件根目录下,打开git bash命令窗口;2、初始化本地仓库:git init3、添加本地所有文件到本地仓库:git add . (注意有“.”号)4、将文件提交到本地仓库: git commit -m 'first commit'5、将远程仓库与本地仓库关联起来:git remote add origin https://github.com/HaiTaoFeng/TestGit.git6、

2020-09-23 10:58:03 2640

原创 Android 绘制产生重影(重叠)

Android 绘制产生重影(重叠)今天遇到一个比较奇葩的问题,控件设置的文字、背景、图片等一直重叠在一起,不刷新的问题。如TextView控件,调用setText()方法时,新的文字会覆盖在旧的文字上面,旧的文字没有消失,就这样一直覆盖,最后变成一坨。设置背景也是一样,不断调用setBackgroundResource()方法,背景会一层一层覆盖。后面才发现是页面背景导致的,当你的页面背景设置为null时,没有背景就会出现这个问题。我的页面代码是这样的:<?xml version="1.0"

2020-08-31 20:40:44 4403 1

原创 AS运行main()方法报错:SourceSet with name ‘main‘ not found

AS运行main()方法报错:SourceSet with name ‘main’ not found记录一下在AS上运行Java文件的main()方法时报错,报错如下:解决方法:在.idea文件夹下的gradle.xml文件中添加<option name="delegatedBuild" value="false" />,然后重新运行就可以了......

2020-08-10 13:53:46 27840 28

原创 Java反射以及简单应用

Java反射以及简单应用1.什么是反射机制?Java的反射(reflection)机制是指在程序的运行状态中,可以构造任意一个类的对象,可以了解任意一个对象所属的类,可以了解任意一个类的成员变量和方法,可以调用任意一个对象的属性和方法。这种动态获取程序信息以及动态调用对象的功能称为Java语言的反射机制。反射被视为动态语言的关键。2.什么是字节码文件?.java文件经过虚拟机编译成.class文件,也叫字节码文件。对于一个字节码文件.class,虽然表面上我们对该字节码文件一无所知,但该文件本身却记

2020-08-08 14:18:24 838

原创 Android实现文字滚动播放效果

Android实现文字滚动播放效果在开发时,我们会遇到文字过长,TextView不能完全展示,但又不想文字换行展示,这样有时会影响美观。这时我们就需要文字滚动播放,让用户可以看到所有的文字。话不多说,直接上代码:import android.content.Context;import android.util.AttributeSet;import android.widget.TextView;public class MarqueTextView extends TextView {

2020-07-23 10:02:38 4880

原创 Android性能优化(四):内存优化

Android性能优化(四):内存优化前言在讲内存优化之前,我们先讲一下GC回收机制。Java相比于C语言不同的地方在于,Java不需要手动释放对象内存,JVM中的垃圾回收器会自动回收。但是这种自动回收是会出错的,而这种出错就会导致内存的泄漏。1.垃圾回收1.1 什么是垃圾?Java中的垃圾是指在内存中没有被调用的对象。JVM中使用“可达性分析”的算法来判断对象是否可以被回收。通过一组名为“GC Root”的对象作为起点,直接或者间接被“GC Root”引用的为不可回收对象,否则为可回收对象。如下

2020-07-14 19:08:31 472

原创 Java注解的简单使用

注解的简单使用记录一下,使用注解声明变量。1、新建注解类InjectPresenter.javaimport java.lang.annotation.ElementType;import java.lang.annotation.Retention;import java.lang.annotation.RetentionPolicy;import java.lang.annotation.Target;/** * 注解类 * @author fht */@Retention(Re

2020-07-08 19:34:29 338

原创 Android性能优化(三):响应优化

Android性能优化(三):响应优化1、为什么要进行响应优化?我在[布局优化]的文章中说过,Android系统每隔16ms会发出一个VSYNC信号来触发UI的渲染,如果在16ms内不能完成UI的渲染,界面就出现卡顿的情况。页面如果5秒钟之内无法响应屏幕触摸事件或者键盘输入事件就会出现ANR,而BroadcastReceiver如果10秒钟之内还未执行完操作也会出现ANR。为了避免ANR,我们需要进行响应速度的优化。(https://blog.csdn.net/weixin_42574892/artic

2020-07-07 10:11:10 1077

原创 Android性能优化(二):UI布局优化

Android性能优化(二):UI布局优化一、前言人眼在看画面时,画面帧率高于每秒10-12帧(即每秒播放10-12张图片)的时候,就会认为是连贯的。一般电影的拍摄及播放帧数是每秒24帧。按道理说,画面帧率越高,用户体验越好,但这也代表着成本越高。Android APP的性能标准是60fps,即1秒之内要达到60帧,这样我们就只有1000/60 = 16 毫秒的时间来处理任务。Android系统每隔16ms会发出一个VSYNC信号来触发UI的渲染。如果在16ms内不能完成UI的渲染,界面就出现卡顿的情

2020-06-04 17:12:41 1322

原创 AS 点击Run app不能将apk打包在手机上

AS 点击Run 'app’不能将apk打包在手机上最近再跑一个项目,项目编译没问题。点击Run 'app’项目在跑,但是跑完之后,手机却没反应,apk也没装上,需要从output文件夹拷贝apk到手机里。个人感觉这样调试太麻烦了,上网找了一下解决方案,说是AS版本问题,我用的是3.6的,具体原因我也不太清楚。解决方案:第一步第二步第三步:先Gradle project选择app,Tasks中输入installDebug,然后点击ok就可以了。......

2020-06-03 15:53:08 1863

原创 解决AS编译报错:Failed to apply plugin [id com.android.application]

解决AS编译报错:Caused by: org.gradle.api.internal.plugins.PluginApplicationException: Failed to apply plugin [id ‘com.android.application’]编译Android项目时总是遇到以上报错,所以记录一下。解决方法:添加android.overridePathCheck=true就可以了。其实解决的方法可以在Event Log窗口中找到,如图下:从日志第一句可以看出,应该是项目路径包

2020-05-25 08:30:25 78711 13

原创 Android在页面设置背景图片

Android在页面设置背景图片在页面上设置背景,不需要在布局中设置。在onCreate方法中加入代码:getWindow().setBackgroundDrawableResource(R.drawable.a);R.drawable.a为res资源文件夹下的资源图片a

2020-05-21 13:46:28 5691 3

原创 Android性能优化(一):APP启动优化

App启动的方式有三种: 1. 冷启动:App没有启动过或App进程被killed, 系统中不存在该App进程, 此时启动App即为冷启动。 2. 热启动:热启动意味着你的App进程只是处于后台, 系统只是将其从后台带到前台, 展示给用户。 3. 介于冷启动和热启动之间, 一般来说在以下两种情况下发生: (1)用户back退出了App, 然后又启动, App进程可能还在运行,但是activity需要重建。 (2)用户退出App后, 系统可能由于内存原因将App杀死, 进程和activity都.

2020-05-20 13:41:57 2392

原创 Android实现APP黑白化

Android实现APP黑白化使用硬件加速的方法来达到黑白化效果。先上效果图吧黑白化之前:黑白化之后:实现代码:Paint mPaint = new Paint();ColorMatrix cm = new ColorMatrix();cm.setSaturation(0);mPaint.setColorFilter(new ColorMatrixColorFilter(cm));getWindow().getDecorView().setLayerType(View.LAYER_T

2020-05-15 18:00:16 4151

原创 Android屏幕适配(二):AutoSize今日头条屏幕适配方案

Android屏幕适配(二):AutoSize今日头条屏幕适配方案AutoSize是今日头条使用的屏幕适配方案。原理:调用Android API,根据设备某一维度(宽或高)的真实长度(单位是px)与这一维度在UI设计图上的dp值之间的关系,重新计算density来实现。优点:1.支持以宽或者高任意一个维度去适配,保持该维度上和设计图一致;2.支持dp和sp单位,控制迁移成本到最小。集成方法:1.添加gradle配置代码:implementation 'me.jessyan:autosize:1

2020-05-15 10:23:36 4991 4

原创 Android屏幕适配(一):ScreenMatch官方屏幕适配方案

Android ScreenMatch官方屏幕适配方案Screenmatch屏幕适配是Google退出的适配方法,只需要使用官方的Screenmatch插件。原理:Screenmatch是拿dp值来进行等比例缩放来适配的。根据你的配置生成需要适配的屏幕尺寸的dimens.xml文件,运行时,系统会找到对应尺寸的dimens.xml文件。优点:1.对文字缩放更友好;2.可以一键生成需要适配的尺寸;1、在AS中点击File→Settings,找到Plugins输入screenmatch安装ScreenM

2020-05-14 13:59:46 5224

原创 Android Q读写共享目录媒体文件

Android Q读取公共目录媒体文件有些人通过文件名称去查找公共目录下媒体文件却获取不到,可能是由于查询条件写错了。注意下MediaStore.Video.Media.DISPLAY_NAME 参数,我用MediaStore.Video.Media.BUCKET_DISPLAY_NAME这个就查询不到,具体这两个有什么不同,可以自己去查资料。1.读取公共目录下的图片/** * 读......

2020-04-29 15:26:28 3510 4

原创 Android多渠道打包

Android多渠道打包Android多渠道打包就是一次性打出多个不同命名的apk。我这里是使用Android Studio3.6版本打包的,低版本的可能有点差异。先上效果图吧:1.在androidManifest.xml中进行配置。<meta-data android:name="CHANNEL" android:value="${CHANNEL_VALUE}"/&......

2020-04-24 14:00:58 994 2

原创 Android将so库封装到jar包中并加载其中的so库

Android将so库封装到jar包中并加载之前写过将jar包和so库封装到jar包中的文章,但是没有考虑别人调用时需要加载so库的问题。因为so库放入jar之后,so就不是一个独立的.so文件了,用System.load()加载就会提示找不到这个库,所以要想加载这个so 就需要把so 从jar 中提取出来,保存为临时文件,然后再加载。但是不能直接提取.so文件,需要把.so文件改成.jet文件......

2020-04-23 15:37:10 6860 21

原创 Android热点、WiFi、蓝牙等功能开启和关闭

Android热点、WiFi、蓝牙等功能开启和关闭1、需要添加权限,选择自己需要的添加,热点的开启和关闭可能还需要权限;<!--设备(亮屏)权限--><user-permission android:name="android.permission.DEVICE_POWER" /><!--息屏权限--><uses-permission andro......

2020-04-09 11:11:22 5245

原创 Android中socket通信简单实现

Android中socket通信简单实现socket通信需要有一个服务器和客户端,可以把同一个APP作为服务器跟客户端,也可以分开成两个APP。先上个图:这里以一个APP作为服务器跟客户端为示例1、添加网络访问权限<uses-permission android:name="android.permission.INTERNET" />2、写服务器,在APP上启动im......

2020-04-02 15:29:10 15460 5

原创 windows系统下编译FFmpeg3.3.9和4.2.2版本

windows系统下编译FFmpeg最新版本最近项目需要集成ffmpeg到Android项目,所以需要把ffmpeg编译成so库给Android项目引用。这里只说编译FFmpeg3.3.9和FFmpeg4.2.2两个版本,其它应该都适用。一、需要用到的东西1、MSYS2 64位(搭建C++编译环境)2、android-ndk-r15c-windows-x86_64(64位)3、ffmpe......

2020-03-10 15:28:36 3996

原创 Android 在应用中使用用户凭证(PIN码、密码)

Android 在应用中使用用户凭证(PIN码、密码)在Android开发过程需要使用到用户凭证来验证用户身份,验证成功用户才能继续操作。需要注意的是:minSdkVersion 必须大于或等于23,否则APP会报错。先上效果图(在30s内不操作,点击确认按钮需要进行身份验证):以下是activity代码import android.app.Activity;import androi......

2020-02-18 09:27:02 4941

AIDLDemo.rar

Android 多进程AIDL例子,使用aidl将服务端的数据传输给客户端,并且进行数据订阅。当服务端有数据,客户端可以及时收到。

2020-08-03

mips64el-linux-android-4.9.rar

Android缺少相关的工具链时,需解压mips64el-linux-android-4.9.rar放到toolchains目录下

2020-04-13

jd-gui-windows-1.4.0.rar

Android反编译工具,用于将jar文件转化为java代码。使用方法:解压后,打开exe文件,将jar拖进去就可以

2019-07-19

dex2jar-2.0.rar

对APK进行反编译查看源代码的工具,解压后将apk的dex包转为jar,方便后续查看代码!

2019-07-19

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除