毛玻璃擦出效果的实现
效果国际惯例,先上图~
思路
算不上什么思路,就是想了下大概要用上哪些技术,自定义view没得说,onTouchEvent()要重写,获取指尖路径;
擦除动画得用上Xfermode;
高斯模糊效果的两种方案。恩,应该就这些了吧。
代码指尖路径
手指擦除的线比较粗,paint搞粗一点,再弄个圆角:
12345678paint.apply { color = Color.WHITE style = Paint.Style.STROKE isAntiAlias = true strokeWidth = 70f strokeJoin = Paint.Join.ROUND strokeCap = Paint.Cap.ROUND}
onTouchEvent里面保存路径到path
1234567891011121314151617181920override fun onTouchEvent(event: MotionEvent): Boolean { val x = event.x val y = eve ...
View/ViewGroup 的测量(measure )流程
View/ViewGroup 的测量(measure )流程上文可知,ViewRootImpl.performMeasure中最终是跳到了ViewGroup的Measure方法中来了,我们来看看ViewGroup.Measure()方法。
ViewGroup的MeasureViewGroup没有measure方法。
稍安勿躁,viewGroup继承自view,ViewGroup没有,就看View的。
123456789101112131415public final void measure(int widthMeasureSpec, int heightMeasureSpec) { boolean optical = isLayoutModeOptical(this); if (optical != isLayoutModeOptical(mParent)) { ... if ((mPrivateFlags & PFLAG_FORCE_LAYOUT) == PFLAG_FORCE_LAYOUT | ...
对java锁的一点理解
先上图
测试代码12345678910111213141516171819202122public class Test { static int m = 0; public static void main(String[] args) throws InterruptedException { Thread[] threads = new Thread[10]; for (int i = 0; i < threads.length; i++){ threads[i] = new Thread(new Runnable() { public void run() { for (int i = 0; i < 10000; i++) m++; } }); } for (Thread t :t ...
对Handle的一点理解
Handler是什么
个人理解:Handler是进程间进行通信的一种方式。
官方:
A Handler allows you to send and process Message and Runnable objects associated with a thread’s MessageQueue. Each Handler instance is associated with a single thread and that thread’s message queue. When you create a new Handler it is bound to a Looper. It will deliver messages and runnables to that Looper’s message queue and execute them on that Looper’s thread.
Handler允许你发送Message并处理Runnable对象,通过MessageQueue的关联。每个Handler实例和线程,和线程的MessageQueue相关联。当 ...
View体系相关
关于Android View体系里面的相关知识,可能会比较乱,先都罗列出来再说,后期再做整理。
自己做的笔记,不太适合学习用,大家看看就好,有问题烦请指正。
几个常用对象之间的关系Activity 间接继承自 Context
activity.getWindow 获取到的是 PhoneWindow,继承自 Window(抽象类)
PhoneWIndow中持有mDecor① 和 mContentParent②:
①:mDecor = new DecorView(),间接继承ViewGroup DecorView extends FrameLayout extends ViewGroup
②:mContentParent = generateLayout(mDecor);
`protected ViewGroup generateLayout(DecorView decor)`
`mContentParent `是`ViewGroup`对象
setContentView的执行
getWindow().setContentView(resID),其中window对象在 ...
Cannot fit requested classes in a single dex file
Cannot fit requested classes in a single dex file (# methods: 66661 > 65536)原因:dex文件中方法过多;
解决:推荐引入使用MultiDex包解决
1 引入依赖api 'androidx.multidex:multidex:2.0.1'(版本可选)
2 app的build.gradle中加入multiDexEnabled true
defaultConfig {
applicationId "com.xx.xxxx"
minSdkVersion 19
targetSdkVersion 29
versionCode 1
versionName "1.0"
//写在这里~
multiDexEnabled true
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
...
javaString和String itern的理解
最近看尚硅谷2020最新版宋红康JVM教程更新至中篇(java虚拟机详解,jvm从入门到精通)视频,解决了部分java String方面的疑惑,在此做个笔记。
##0. Sting a = s.intern() 之intern()方法从字符串常量池中查询是否存在字符串“s”。
若存在,则将此地址指向a;若不存在,则:
jdk1.6中:在常量池中new出该字符串(“s”),并将其指向a。
jdk1.7及以上中:堆空间中有“s”,则在常量池中创建指向堆空间中s的引用;否则,在常量池中new出该字符串(“s”),并将其指向a(同上)。
*jdk1.6之前的常量池不在堆中,在方法区中,故而画在外面。
##1. String a = “ab”“ab”直接存到了常量池中。
##2. String a = new String(“ab”)实质上new了两个对象:1.new了个String类型的对象,放在堆中;2.常量池中放入“ab”。 证据请看编译后的字节码(第一行和第三行):
123456 0 new #2 <java/lang/String ...
Java中的Runnable、Callable和Future的关系
Java中的Runnable、Callable和Future的关系前提Java中多线程包下相关的接口有Runnable、Callable和Future。
Runnable
123public interface Runnable { void run();}
Callable
123public interface Callable<V> { V call() throws Exception;}
Runnable和Callable的区别
Runnable执行方法是run(),Callable是call()
Runnable无返回值且不会抛错;Callable带返回值且可以向外抛异常。
这两个只是个接口,并不能用来进行线程相关操作。开辟线程还是要用Thread,而Thread又只能传Runnable,不支持传Callable,怎么破?
解决方法:创建一个类,让他实现Runnable接口,然后内部持有一个Callable对象。在Runnable的run方法中调用mCallable.call()方法。
妙啊~
这 ...