自定义View 1-3drawText()文字的绘制
1 Canvas 绘制文字的方式Canvas 的文字绘制方法有三个:drawText() drawTextRun() 和 drawTextOnPath()。
1.1 drawText(String text, float x, float y, Paint paint)drawText() 是 Canvas 最基本的绘制文字的方法:给出文字的内容和位置, Canvas 按要求去绘制文字。
val text = "Hello HenCoder"canvas.drawText(text, 200f, 100f, paint)
1.2 drawTextRun()drawTextRun() 是在 API 23 新加入的方法。它和 drawText() 一样都是绘制文字,但加入了两项额外的设置——上下文和文字方向——用于辅助一些文字结构比较特殊的语言的绘制。
额外设置一:上下文。
有些语言的文字,字符的形状会互相之间影响:一个字你单独写是一个样,和别的字放在一起写又是另外一个样。
不过我们就不用管它为什么这么神奇了,也不用替阿拉伯人操心这么复杂的文字他们使用起来会不会很 ...
自定义View2 Paint
自定义View1-2 Paint详解1颜色Canvas绘制的内容,有三层对颜色的处理:
基本颜色:1、Canvas.drawColor/ARGB() –颜色参数  2、Canvas.drawBitmap()–bitmap参数  3、Canvas图形和文字绘制–paint参数。
ColorFilter:Paiint.setColorFilter(CorlorFilter)。
Xfermode:Paint.setXfermode(Xfermode)。
1.1 基本颜色像素的基本颜色,根据绘制内容的不同而有不同的控制方式:
Canvas的颜色填充类方法drawColor/RBG/ARGB() 直接作为参数传入。
drawBitmap()的颜色与bitmap参数的像素颜色相同。
图形和文字(drawCircle()/drawPath()/drawText()…)  在paint参数中设置。
Paint设置颜色的方法有两种:一种是直接用 Paint.setColor/ARGB() 来设置颜色,另一种是使用 shader 来指定着色方 ...
入门ndk
So中常用的Log输出#include<android/log.h>#define TAG "xiaojianbang"#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG, TAG, __VA_ARGS__);#define LOGI(...) __android_log_print(ANDROID_LOG_INFO, TAG, __VA_ARGS__);#define LOGE(...) __android_log_print(ANDROID_LOG_ERROR, TAG, __VA_ARGS__);
NDK多线程JavaVM每个进程中只有一份
JNIEnv每个线程中都有一份
//线程id,其实就是longpthread_t thread;//线程id 线程属性 函数 传递给函数的参数pthread_create(&thread, nullptr, myThread, nullptr);//等待线程执行完毕//默认的线程属性是joinable 随着主线程结束而结束//线程属性是det ...
android逆向基础
cmd常用快捷键新选项卡: ctrl+shift+d/t
划分窗格: alt+shift+d/加号/减号
关闭窗格: ctrl+shift+w
调整窗格: alt+shift+方向键
窗格切换: alt+方向键
Java位运算符右移>>4 -> 0000 01004 >> 1 -> 0000 0010
Hex编码1 byte = 8 bit每个十六进制数对应4个二进制位
数组初始化方法静态初始化元素类型[] 数组名 = new 元素类型[]{元素,元素,、、、}int[] arr = new int[]{1,2,3,4,5}int[] arr = {1,2,3,4,5}相当于int[] arr = new int[5]arr[0] = 1; arr[1] = 2; arr[2] = 3; arr[3] = 4; arr[4] = 5
动态初始化元素类型[] 数组名 = new 元素类型[数组长度]int[] arr = new int[5]
二维数组定义 ...
frida相关API
hook方法的所有重载Java.perform(function(){        function showStacks(){        console.log(        	Java.use("android.util.Log")            	.getStackTraceString(                	Java.use("java.lang.Throwable").$new()                )        );    }        var utils = Java.use("com.xiaojianbang.hook.Utils");    var overloadsArr = utils.getCalc.overloads;    for(var i = 0; i < overloadsArr.length; i++){        overloadsArr[i].implementation = functio ...
自定义View
Canvas.drawXXX() 和 Paint 基础Canvas.drawColor(@ColorInt int color)颜色填充这是最基本的drawXXX()方法:在整个绘制区域涂上指定的颜色。
canvas.drawColor(Color.BLACK) //纯黑canvas.drawColor(Color.parseColor("#88880000")) //半透明红色
类似的方法还有drawRGB(int r, int g, int b) 和 drawARGB(int a, int r, in g, int b),它们和drawColor(color)只是使用方式不同,作用都是一样的。
canvas.drawRGB(100, 200, 100);canvas.drawARGB(100, 100, 200, 100); //第一个参数代表透明度,值越小越透明
drawCircle(float centerX, float centerY, float radius, Paint paint) 画圆前两个参数centerX、centerY是圆心的坐标,第 ...
frida之关键代码快速定位
HashMap的put方法Java.perform(function(){       function showStacks(){        console.log(        	Java.use("android.util.Log")            	.getStackTraceString(                	Java.use("java.util.Throwable").$new()                )        );    }        var hashMap = Java.use("java.util.HashMap");    hashMap.put.implementation = function(a,b){        if(a.equals("username")){            showStacks()            console.log("hashM ...
SunnyWeather3
第三阶段手动刷新天气修改activity_weather.xml中的代码,如下所示:
<androidx.swiperefreshlayout.widget.SwipeRefreshLayout      xmlns:android="http://schemas.android.com/apk/res/android"      android:id="@+id/swipeRefresh"      android:layout_width="match_parent"      android:layout_height="match_parent">      <ScrollView          android:id="@+id/weatherLayout"          android:layout_width="match_parent"          android:layout_height="match_par ...
SunnyWeather2显示天气信息
显示天气信息实现逻辑层代码获取实时天气接口时返回的JSON数据格式,简化后的内容如下所示:
{      "status": "ok",      "result": {          "realtime": {              "temperature": 23.16,              "skycon": "WIND",              "air_quality": {              "aqi": { "chn": 17.0 }              }          }      } }
那么我们只需要按照这种JSON格式来定义响应的数据模型即可。在logic/model包下新建一个RealtimeResponse.kt文 ...
SunnyWeather
第一阶段功能需求及技术可行性分析在开始编码之前,我们需要先对程序进行需求分析,想一想SunnyWeather中应该具备哪些功能。将这些功能全部整理出来之后,我们才好动手去一一实现。这里我认为SunnyWeather中至少应该具备以下功能:
可以搜索全球大多数国家的各个城市数据
可以查看全球绝大多数城市的天气信息
可以自由地切换城市,查看其他城市的天气
可以手动刷新实时的天气
虽然看上去只有4个主要的功能点,但如果想要全部实现这些功能,却需要用到UI、网络、数据、存储、异步处理等技术,因此还是非常考验你的综合应用能力的。不过好在这些技术在前面的章节中我们全部学习过了,只要你学得用心,相信完成这些功能对你来说并不难。
分析完了需求之后,接下来就要进行技术可行性得分析了。毫无疑问,当前最重要得问题就是,我们如何才能得到全球大多数国家得城市数据,以及如何才能获取每个城市的天气信息。比较遗憾的是,现在网上免费的天气预报接口已经越来越少,很多之前可以使用的接口也慢慢关闭了。为了能够给你提供功能强大且长期稳定的服务器接口,本书最终选择了彩云天气。
彩云天气是一款非常出色的天气预报App,本章中我 ...

