<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[Android_Study_OK的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/Android_Study_OK</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; Android_Study_OK]]></copyright><item><title><![CDATA[多点触摸处理]]></title><link>https://blog.youkuaiyun.com/Android_Study_OK/article/details/103423744</link><guid>https://blog.youkuaiyun.com/Android_Study_OK/article/details/103423744</guid><author>Android_Study_OK</author><pubDate>Fri, 06 Dec 2019 17:21:52 +0800</pubDate><description><![CDATA[接着上文，我们做了一个简陋的下拉刷新控件，目前用到的知识点有

view的滑动
view的弹性滑动
事件分发机制
事件分发机制的两个小问题（事件的二次分发）

目前这个控件除了简陋一点，没做抽象封装，在单手操作下，表现还是不错的，但是多手操作试一下，页面会产生位移突变。这就引出了本节的多点触摸知识点
首先推荐这个大神的博客
安卓自定义View进阶-MotionEvent详解
安卓自定义View进阶...]]></description><category></category></item><item><title><![CDATA[触摸事件分发机制（有用的小技巧：事件二次分发）]]></title><link>https://blog.youkuaiyun.com/Android_Study_OK/article/details/103410244</link><guid>https://blog.youkuaiyun.com/Android_Study_OK/article/details/103410244</guid><author>Android_Study_OK</author><pubDate>Thu, 05 Dec 2019 19:39:44 +0800</pubDate><description><![CDATA[存在的问题
在上文的下拉刷新控件中，有两个问题

在下拉到ScrollView顶部时候，继续往下拉时，并不会直接把头布局拉下来，而是需要把手松开后，再次下拉才会拉下头布局，为什么？


上文说过，onInterceptTouchEvent方法虽然不是每次都被调用，但是如果子view在处理事件的时候，onInterceptTouchEvent是一直会调用的，因为他要等待子View不想消费事件的时机出...]]></description><category></category></item><item><title><![CDATA[触摸事件分发机制]]></title><link>https://blog.youkuaiyun.com/Android_Study_OK/article/details/103398896</link><guid>https://blog.youkuaiyun.com/Android_Study_OK/article/details/103398896</guid><author>Android_Study_OK</author><pubDate>Thu, 05 Dec 2019 14:11:16 +0800</pubDate><description><![CDATA[触摸事件分发这是我之前写的一篇事件分发的博客，这篇文章是在看了《Android开发艺术探索》后写的，书中已经给出了【外部拦截法】和【内部拦截法】的模板代码，我们可以直接拿来使用即可，书中也给出了看源码后的重要结论，博客里我写了个demo，以打印log的方式验证了一遍，帮助理解了一遍事件分发的流程。更加详细内容可参考触摸事件分发。
本篇博客贴出【外部拦截法】和【内部拦截法】代码，供大家上手使用，然后...]]></description><category></category></item><item><title><![CDATA[View的滑动与弹性滑动（ScrollBy+Scroller）]]></title><link>https://blog.youkuaiyun.com/Android_Study_OK/article/details/103374937</link><guid>https://blog.youkuaiyun.com/Android_Study_OK/article/details/103374937</guid><author>Android_Study_OK</author><pubDate>Tue, 03 Dec 2019 19:39:43 +0800</pubDate><description><![CDATA[这次做一个SwitchView1，与上文的效果是一样的，但是
1.跟随手滑动使用scrollBy，
2. 松手后的弹性滑动使用scroller
需要使用下面的几个结论：
结论


系统很多控件都是使用了scrollBy+scorller来实现滑动效果的，例如ViewPager就是如此


scrollBy（dx，dy）增量滑动，


scrollTo（x，y）直接滑动到指定坐标处


在本例中，一...]]></description><category></category></item><item><title><![CDATA[View的滑动与弹性滑动（改变View的参数+属性动画）]]></title><link>https://blog.youkuaiyun.com/Android_Study_OK/article/details/103365799</link><guid>https://blog.youkuaiyun.com/Android_Study_OK/article/details/103365799</guid><author>Android_Study_OK</author><pubDate>Tue, 03 Dec 2019 15:01:41 +0800</pubDate><description><![CDATA[这次做一个SwitchView，需要使用下面的几个结论：
结论：

为了避免手写onMeasure和onLayout，不要直接继承ViewGroup，而是继承LinearLayout、FrameLayout、RelativeLayout这种已经重写过了onMeasure和onLayout的布局



如何获取控件的宽高

我们知道经常因为控件还没加载出来就去获取宽高，那么得到的宽高为0，使用vie...]]></description><category></category></item><item><title><![CDATA[自定义ViewGroup的一个综合实践 FlowLayout]]></title><link>https://blog.youkuaiyun.com/Android_Study_OK/article/details/103355669</link><guid>https://blog.youkuaiyun.com/Android_Study_OK/article/details/103355669</guid><author>Android_Study_OK</author><pubDate>Mon, 02 Dec 2019 19:45:18 +0800</pubDate><description><![CDATA[效果

]]></description><category></category></item><item><title><![CDATA[让自定义ViewGroup支持Padding]]></title><link>https://blog.youkuaiyun.com/Android_Study_OK/article/details/103349888</link><guid>https://blog.youkuaiyun.com/Android_Study_OK/article/details/103349888</guid><author>Android_Study_OK</author><pubDate>Mon, 02 Dec 2019 16:03:23 +0800</pubDate><description><![CDATA[结论：

让自定义ViewGroup支持Padding，需要自定义ViewGroup在自身的onMeasure和onLayout里去处理Padding即可


因为padding很容易获得，不像是Margin那么麻烦，
另外与margin不同的是，padding是自定义ViewGroup的padding，只有四个padding，而margin是子控件的margin，每个子控件都会有四个margin...]]></description><category></category></item><item><title><![CDATA[让自定义ViewGroup里的子控件支持Margin]]></title><link>https://blog.youkuaiyun.com/Android_Study_OK/article/details/103347839</link><guid>https://blog.youkuaiyun.com/Android_Study_OK/article/details/103347839</guid><author>Android_Study_OK</author><pubDate>Mon, 02 Dec 2019 14:27:16 +0800</pubDate><description><![CDATA[结论：

让自定义ViewGroup里的子控件支持Margin，需要自定义ViewGroup在自身的onMeasure和onLayout里去处理Margin，


因为子控件写margin之后，必然会让自定义ViewGroup的宽高受到影响（所以onMeasure需要处理）
子控件写margin之后，自定义ViewGroup在摆放这些子控件时候，必须考虑到margin，才能摆放到正确的位置


但...]]></description><category></category></item><item><title><![CDATA[秒懂OnLayout]]></title><link>https://blog.youkuaiyun.com/Android_Study_OK/article/details/103346272</link><guid>https://blog.youkuaiyun.com/Android_Study_OK/article/details/103346272</guid><author>Android_Study_OK</author><pubDate>Mon, 02 Dec 2019 12:11:51 +0800</pubDate><description><![CDATA[结论

onLayout方法就是按照自己的意愿，把每个子控件排列起来，核心代码是通过layout()函数来设置子控件的位置。

应用
1. 接着上文完成MyLinearLayout （竖向的LinearLayout）

上文已经通过重写onMeasure支持了的AT_MOST模式，还差重写onLayout就完成自定义ViewGroup了

 @Override
    protected void...]]></description><category></category></item><item><title><![CDATA[秒懂OnMeasure]]></title><link>https://blog.youkuaiyun.com/Android_Study_OK/article/details/103338679</link><guid>https://blog.youkuaiyun.com/Android_Study_OK/article/details/103338679</guid><author>Android_Study_OK</author><pubDate>Sun, 01 Dec 2019 20:05:14 +0800</pubDate><description><![CDATA[我感觉之所以写不好自定义view，是因为我们了解的自定义View的基础知识知道的太少，但是在了解自定义view的基础知识的过程中，又很容易被源码带跑偏，找不到重点，结果是看了很多源码，云里雾里等于没看。
很多时候，源码是很重要，但是不懂适可而止的看源码，你就陷入了汪洋大海。
例如：初中几何里老师讲了“两点之间、直线最短”这个公理后，我们就可以做很多几何题目了，做的过程中还很爽，但是老师没讲“两点...]]></description><category></category></item><item><title><![CDATA[热修复原理浅析（二）]]></title><link>https://blog.youkuaiyun.com/Android_Study_OK/article/details/98620201</link><guid>https://blog.youkuaiyun.com/Android_Study_OK/article/details/98620201</guid><author>Android_Study_OK</author><pubDate>Tue, 06 Aug 2019 15:13:35 +0800</pubDate><description><![CDATA[了解热修复，需要有点预热的知识，先从class文件和dex文件说起

class文件和dex文件
class文件
什么是class文件
他是一种文件格式
简单说，就是能被JVM虚拟机识别、加载、并执行的文件格式
而且除了java语言，还有很多其他语言也可以编译出class文件，当然还有kotlin


上图摘抄自【深入Java虚拟机】之二：Class类文件结构
如何手动编译出一个class文件
...]]></description><category></category></item><item><title><![CDATA[instagram授权流程（第一篇）]]></title><link>https://blog.youkuaiyun.com/Android_Study_OK/article/details/98486456</link><guid>https://blog.youkuaiyun.com/Android_Study_OK/article/details/98486456</guid><author>Android_Study_OK</author><pubDate>Mon, 05 Aug 2019 14:54:23 +0800</pubDate><description><![CDATA[本篇介绍应用注册、授权官方文档，下一篇是demo演示

写在前面的话
你会惊奇地发现，整个授权的过程，竟然不需要集成sdk，甚至说，都几乎不用写代码，这与微信、新浪、QQ授权完全不同
注册账号
首先注册并登录你的Instagram账户
注册账户
注册你的应用
Instagram开发者官方文档



点击 右上角绿色按钮 Register a New Client


如果你还没注册你的app，那...]]></description><category></category></item><item><title><![CDATA[instagram授权流程（第二篇）]]></title><link>https://blog.youkuaiyun.com/Android_Study_OK/article/details/98486878</link><guid>https://blog.youkuaiyun.com/Android_Study_OK/article/details/98486878</guid><author>Android_Study_OK</author><pubDate>Mon, 05 Aug 2019 14:53:26 +0800</pubDate><description><![CDATA[本文分客户端、服务端演示获取access_token的流程,
上一篇介绍了账号注册、官方文档

客户端demo（不推荐）

准确讲，这不是个demo，把流程梳理一下而已

1. 访问下面的网址，注意使用你的ID，你的重定向地址，其余不变
https://www.instagram.com/oauth/authorize/?client_id=你的ID&amp;redirect_uri=你的重定向...]]></description><category></category></item><item><title><![CDATA[热修复原理浅析（一）]]></title><link>https://blog.youkuaiyun.com/Android_Study_OK/article/details/98239077</link><guid>https://blog.youkuaiyun.com/Android_Study_OK/article/details/98239077</guid><author>Android_Study_OK</author><pubDate>Fri, 02 Aug 2019 20:58:29 +0800</pubDate><description><![CDATA[解决的问题

刚发布就发现了严重的bug，需要及时修复
有些小功能需要及时地推送给用户，例如淘宝双十一，搞了了点活动，想让用户马上就使用到，不需要用户去再次下载更新

开始吧

了解热修复，需要有点预备知识，先从class文件和dex文件说起

class文件
什么是class文件
他是一种文件格式
简单说，就是能被JVM虚拟机识别、加载、并执行的文件格式
而且除了java语言，还有很多其他语言也...]]></description><category></category></item><item><title><![CDATA[Android滤镜效果ColorMatrix用法二]]></title><link>https://blog.youkuaiyun.com/Android_Study_OK/article/details/96481365</link><guid>https://blog.youkuaiyun.com/Android_Study_OK/article/details/96481365</guid><author>Android_Study_OK</author><pubDate>Fri, 19 Jul 2019 15:14:27 +0800</pubDate><description><![CDATA[上一篇文章ColorMatrix的用法本质上就是改变颜色数组（4x5），我们可以直接改变这个数组，完成颜色过滤效果，常见的复古、清新、黑白，就是特定的数组元素搞定的


    public static Bitmap handlerImagebyMatrixArray(Bitmap srcBitmap, float[] colorMatrixArray) {


        // *****...]]></description><category></category></item><item><title><![CDATA[Android：滤镜效果ColorMatrix用法一]]></title><link>https://blog.youkuaiyun.com/Android_Study_OK/article/details/96478925</link><guid>https://blog.youkuaiyun.com/Android_Study_OK/article/details/96478925</guid><author>Android_Study_OK</author><pubDate>Fri, 19 Jul 2019 13:37:38 +0800</pubDate><description><![CDATA[直接上工具类

代码注释写的很清楚了

注意事项：



先复制一张跟原图一模一样的bitmap，不能在原图上做修改


★★★★★切记，不能使用colorMatrix.setRotate()连续设置各个通道的色调,这样的话，会让最后一个覆盖前面的效果,而是要通过postConcat混合多个ColorMatrix



package performance.brilliant.com.bril...]]></description><category></category></item><item><title><![CDATA[Camera开发—如何自定义相机]]></title><link>https://blog.youkuaiyun.com/Android_Study_OK/article/details/96333194</link><guid>https://blog.youkuaiyun.com/Android_Study_OK/article/details/96333194</guid><author>Android_Study_OK</author><pubDate>Wed, 17 Jul 2019 17:35:15 +0800</pubDate><description><![CDATA[自定义摄像头预览功能
github源码
权限

动态权限略

&lt;uses-permission android:name="android.permission.CAMERA" /&gt;

代码

使用SurfaceView


这里不能使用普通的View，因为要实时地显示摄像头捕获到的图像，简单来说View适合被动刷新的情况，SurfaceView适合主动刷新（在子线程里），其余的不多说...]]></description><category></category></item><item><title><![CDATA[Camera开发—如何使用系统相机]]></title><link>https://blog.youkuaiyun.com/Android_Study_OK/article/details/96333063</link><guid>https://blog.youkuaiyun.com/Android_Study_OK/article/details/96333063</guid><author>Android_Study_OK</author><pubDate>Wed, 17 Jul 2019 17:34:38 +0800</pubDate><description><![CDATA[如何使用系统相机
一、最简单的方法（但是得到的图片分辨率很差）
此方法不需要任何权限，因为调起来的是系统相机
    private static int REQ_CODE = 1;
    
    mIv = findViewById(R.id.iv);
    Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
    s...]]></description><category></category></item><item><title><![CDATA[JNI  最佳实践]]></title><link>https://blog.youkuaiyun.com/Android_Study_OK/article/details/92555801</link><guid>https://blog.youkuaiyun.com/Android_Study_OK/article/details/92555801</guid><author>Android_Study_OK</author><pubDate>Mon, 17 Jun 2019 08:39:38 +0800</pubDate><description><![CDATA[阅读本文前，请先阅读

JNI-NDK 在AndroidStudio3.2.1版本集成方法（ndk-build方式）
JNI相关概念的理解

★代表难度等级
★ 实践一：从C里返回String给java
之前我们实现了从C代码里返回了一个字符串，代码如下：


java代码，定义native函数
public class Jni {
    static {
        System.load...]]></description><category></category></item><item><title><![CDATA[JNI相关概念的理解]]></title><link>https://blog.youkuaiyun.com/Android_Study_OK/article/details/91975133</link><guid>https://blog.youkuaiyun.com/Android_Study_OK/article/details/91975133</guid><author>Android_Study_OK</author><pubDate>Fri, 14 Jun 2019 14:57:01 +0800</pubDate><description><![CDATA[阅读本文前，前先阅读 JNI-NDK 在AndroidStudio3.2.1版本集成方法（ndk-build方式），了解jni在AndroidStudio里的集成步骤

概念
Java 原生接口 (JNI)：JNI 是 Java 和 C++ 组件用以互相通信的接口。
理解JNI
先说说JNIEnv

现在说的是C里的JNIEnv，不是C++里的JNIEnv，有点区别，但是理解了C里的JNIEnv...]]></description><category></category></item></channel></rss>