
安卓进阶
文章平均质量分 72
AllenC6
来战
展开
-
RecyclerView的Item中的View,被屏幕遮挡,没显示完全,调用此方法就能滑到展示完全
【代码】RecyclerView的Item中的View,被屏幕遮挡,没显示完全,调用此方法就能滑到展示完全。原创 2023-02-08 15:45:50 · 925 阅读 · 1 评论 -
获取RecyclerView滑动的距离
如代码所述,totalDy的确保存了 RecyclerView 的滑动距离,但是当我向下滑动 RecyclerView ,之后插入/删除/移动 Item 的时候,totalDy 就变得不精确了;这是因为recyclerViewl.getChildAt(0) 返回的永远是第一个可见的child,不是所有view list 的第一个child,因此这种用法是得不到滑动距离的。依靠第一个item的滑动距离来进行动画的设置,但是根据该方法得出的 totalDy 在滑动到一定程度后清零。原创 2023-01-11 11:19:21 · 1436 阅读 · 0 评论 -
Fragment通过FragmentManager通信
(2).如果在 FragmentA 中接受 FragmentB 发送的数据,FragmentA 是 FragmentB 的父容器,那对于FragemntA来说它和FragemntB的共同的FragmentManager是A的childFragmentManager,对于FragmentB来说它和A的共同的FragmentManager是B的parentFragmentManager,所以A接收B的消息用childFragmentManager,B发送A的消息用parentFragmentManager。原创 2022-12-31 10:54:43 · 1462 阅读 · 0 评论 -
Android动态的显示和隐藏状态栏,亲测有效
参数为true时,隐藏状态栏,参数为false时,显示状态栏。原创 2022-12-20 18:18:05 · 817 阅读 · 0 评论 -
RecyclerView缓存复用详细解析
Scrap是RecyclerView中最轻量的缓存,它不参与滑动时的回收复用,只是作为重新布局时的一种临时缓存,缓存(保存)动作只发生在重新布局时,布局完成后就要清空缓存。它的目的是,缓存当界面重新布局(不包括初始化第一次)的前后都出现在屏幕上的ViewHolder,这样就省去了不必要的CreateView和bindView的工作。.........原创 2022-08-30 18:51:35 · 1552 阅读 · 0 评论 -
事件处理机制原理分析
这里的cb就是Activity,所以cb.dispatchTouchEvent(ev)就是调用Activity的dispatchTouchEvent(ev)方法,所以事件的传递是先到DecorView的dispatchTouchEvent再到Activity的dispatchTouchEvent。原创 2022-08-16 19:36:51 · 385 阅读 · 0 评论 -
View绘制流程
是在onResume之后。原创 2022-08-11 23:54:54 · 579 阅读 · 0 评论 -
setContentView详解
setContentView我们在Activity中经常见到,它的作用就是把我们的布局文件放在Activity中显示,下面我们根据源码分析setContentView是如何做到的。原创 2022-07-20 19:36:59 · 11186 阅读 · 0 评论 -
Android虚拟机和类加载机制
一、Android虚拟机1.虚拟机的作用虚拟机的作用就是给我们的代码提供运行时环境。什么是运行时?简单来说,运行时就是一个供操作系统使用的系统,它负责将你用高级语言(比如 Java)编写的代码转换成 CPU/处理器能够理解的机器码。运行时由你的程序运行时所执行的指令构成,尽管本质上它们不属于程序代码的任何一部分。CPU (或者更通用的说法电脑)只能够理解机器语言(二进制代码),所以为了使程序能够在 CPU 上运行,就必须将它们翻译成机器码,这一工作由翻译器完成。2.dalvik虚拟原创 2022-04-27 00:22:36 · 827 阅读 · 0 评论 -
从外部获取ViewPager2的Item的View
1.在写ViewPager2的ViewHolder的时候给ItemView设置tag为当前的ViewHolder public static class ViewHolder extends RecyclerView.ViewHolder { public ViewHolder(View itemView) { super(itemView); itemView.setTag(this); } }设置之后原创 2022-04-13 18:26:45 · 3260 阅读 · 3 评论 -
横向ViewPager2内部嵌套竖向的RecyclerView,在滑动RecyclerView的时候很容易触发外部ViewPager2的横向滑动
一 、原因ViewPager2的内部实现是RecyclerView,当手势横向移动的距离大于touchSlop的时候,就会认定你有横向滑动的手势,进而驱动ViewPager2进行左右滑动二、解决办法重写内部嵌套的RecyclerView:public class RecyclerViewInVP2 extends RecyclerView { public RecyclerViewInVP2(@NonNull Context context) { super(co原创 2022-04-07 11:55:46 · 2378 阅读 · 0 评论 -
APT技术原理和简单实现
原理: 编写好的 Java 源文件,需要经过 javac 的编译,翻译为虚拟机能够加载解析的字节码 Class 文件。注解处理器是 javac 自带的一个工具,用来在编译时期扫描处理注解信息。你可以为某些注解注册自己的注解处理器。 注册的注解处理器由 javac调起,并将注解信息传递给注解处理器进行处理。简单实现:我们可以给我们的自定义注解写一个处理器来在编译的时候,处理一些逻辑,上面说到了原理就是在编译的时候如果我们注册了自己的注解处理器,javac就会帮我们调起,这样就能执行我们的逻辑了.原创 2021-12-03 11:37:56 · 4484 阅读 · 0 评论 -
用注解、反射、动态代理实现ButterKnife功能
ButterKnife的实现需要先熟悉注解、反射、动态代理,不熟悉的小伙伴可以去看这三篇文章:Java注解Java反射动态代理下面我们就来看一下ButterKnife的实现:ButterKnife相信大家都会用,它能通过注解帮我们绑定布局文件中的控件,能通过注解帮我们设置view的click事件今天我们除了实现这两个功能还要实现通过注解代替setContentView(R.layout.xxx)功能1.通过注解实现setContentView功能思路:定义一个MyConten原创 2021-12-02 17:15:13 · 2343 阅读 · 0 评论 -
Java 注解
注解的本质就是给载体打一个Tag,我们查找到这个tag后就可以对我们打Tag的载体进行一些特殊处理Java 注解(Annotation)又称 Java 标注,是 JDK5.0 引入的一种注释机制。 注解是元数据的一种形式,提供有关 于程序但不属于程序本身的数据。注解对它们注解的代码的操作没有直接影响。 注解声明 声明一个注解类型Java中所有的注解,默认实现 Annotation 接口:package java.lang.annotation;public interface原创 2021-12-02 16:42:45 · 2856 阅读 · 0 评论 -
源码解析横竖屏切换时ViewModel的mViewModelStore的存储即onRetainNonConfigurationInstance()调用逻辑
横竖屏切换的时候会调用ActivityThread中的handleRelaunchActivity()看名字就知道是要重新启动Activity,handleRelaunchActivity()有个handleRelaunchActivityInner(),从handleRelaunchActivityInner()这个方法开始进入正题:原创 2021-11-23 16:37:09 · 2517 阅读 · 0 评论 -
ViewModel原理,源码分析,通俗易懂
先看使用方法:public class MyActivity extends AppCompatActivity { private MyViewModel vm; @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); MyActivityBinding binding = MyA原创 2021-11-22 11:20:07 · 2259 阅读 · 0 评论 -
LiveData去除粘性
通过上篇:LiveData的源码分析我们知道LiveData的最后一次数据会产生粘性根本原因就是ObserverWrapper.mLastVersion>= mVersion 没有拦住所以只要我们想办法在观察者注册的时候(执行observe方法)修改mLastVersion的值让他等于LiveData中维护的mVersion这样这个判断就能拦住,数据也就没有粘性了如何修改ObserverWrapper实现类LifecycleBoundObserver中的mLastVersion呢?..原创 2021-11-19 18:35:09 · 918 阅读 · 0 评论 -
LiveData原理,源码分析,通俗易懂
本篇文章用到了Lifecycle,如果没有了解过Lifecycle原理的同学请点传送门:Lifecycle原理,源码分析_Allence的博客-CSDN博客大家在看这篇文章的时候最好自己也点开源码跟着一步一步看一看,这样印象深刻 MutableLiveData<String> liveData = new MutableLiveData<>(); liveData.observe(this, new Observer<String&g原创 2021-11-16 19:34:26 · 709 阅读 · 0 评论 -
Lifecycle原理,源码分析,通俗易懂
先看一句Lifecycle最常用的代码: getLifecycle().addObserver(new LifecycleEventObserver() { @Override public void onStateChanged(@NonNull LifecycleOwner source, @NonNull Lifecycle.Event event) { } });被观察者Activity或者Fr原创 2021-11-12 18:06:15 · 6029 阅读 · 2 评论 -
仿微信、QQ左滑删除RecycleView的Item
效果图:凑合着看吧,达到的效果就是测划出现Delete后,触碰任何地方都是会自动的滑回去是一个自定义控件和RecycleView合用。activity:public class TestActivity2 extends AppCompatActivity { @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInst.原创 2021-10-14 19:08:18 · 651 阅读 · 0 评论 -
把View切成圆角的,一般用于播放视频的surfaceView或者TextureView等
@Override protected void dispatchDraw(Canvas canvas) { if (cornner > 0) { Path path = new Path(); path.addRoundRect(new RectF(0, 0, getMeasuredWidth(), getMeasuredHeight()), cornner, cornner, ...原创 2021-10-11 17:14:12 · 1085 阅读 · 0 评论 -
在linearlayout而且是horizontal的布局中如果有几个相邻的textview,排列规则是以baseline为基准而不是bottom或者top
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <LinearLayout android:layout_width="match_parent" android:layout_hei.原创 2021-10-09 19:02:30 · 327 阅读 · 0 评论 -
因为错误使用dialog和ProgressBar 展示加载中样式,出现的内存泄漏
错误代码:Activity:public class TestActivity1 extends AppCompatActivity { public CommonDialog mDialog; private Handler handler; @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceSt原创 2021-03-01 15:49:47 · 525 阅读 · 1 评论 -
记ViewModel和LiveData使用的一些坑与注意点
给出两个自己写的ViewModel:public class MyViewModel extends AndroidViewModel implements Serializable { public static MyMutableLiveData<String> mAccount; public MyViewModel(@NonNull Application application) { super(application); mA原创 2021-02-03 17:06:02 · 6658 阅读 · 0 评论 -
一直以来使用ViewPager和FragmentPagerAdapter或FragmentStatePagerAdapter管理Fragment的错误
viewpager2并没有这个问题。一直以来我在用viewpager和FragmentPagerAdapter或FragmentStatePagerAdapter管理fragment的时候总是和下面的代码类似,但是下面的代码在某些情况下会出现问题接下来我们慢慢分析:public class MainActivity extends FragmentActivity { private ViewPager m_vp; private ArrayList<Fragment&g原创 2021-01-26 18:03:56 · 4187 阅读 · 0 评论 -
Looper getMainLooper 和 Looper.mylooper 的区别
looper.mylooper 实质就是取当前线程的looper,这个Looper在prepare的时候创建并通过threadLocal存储起来的: private static void prepare(boolean quitAllowed) { if (sThreadLocal.get() != null) { throw new RuntimeException("Only one Looper may be created per thread"原创 2021-01-26 16:22:20 · 7259 阅读 · 1 评论 -
fragment 懒加载和三种不同的Adapter的对比
public abstract class LazyFragment extends Fragment { private View rootView = null; private boolean isViewCreated = false; private boolean isCurrentVisibleState = false; @Nullable @Override public View onCreateView(@NonNull Layo.原创 2021-01-25 11:40:53 · 641 阅读 · 0 评论 -
Android 动画深入
动画的简单使用------略!本章内容先介绍一些动画中常用的概念,然后再分别对补间动画和属性动画的原理进行分析。一.1.插值器:插值器在动画中的作用就是影响动画的速度,比如非匀速动画就需要通过插值器来控制动画的播放过程。在安卓中使用的插值器是:TimeInterpolator(时间插值器),它的作用是根据时间流逝的百分比来计算当前属性值改变的百分比(动画完成度的百分比)。那根据...原创 2019-12-20 17:39:12 · 468 阅读 · 0 评论 -
自定义View的分类和注意事项
摘自安卓开发艺术探索第四章1.自定义View的分类(1)继承View重写onDraw方法这种方法主要用于实现一些不规则的效果,即这种效果不方便通过布局的组合方式来达到,往往需要静态或者动态的显示一些不规则的图形。很显然这需要通过绘制的方式来实现,即重写onDraw方法。采用这种方式需要自己支持wrap_content,并且padding也需要自己处理。(2)继承ViewGrope派...原创 2019-12-04 16:31:36 · 215 阅读 · 0 评论 -
自定义View对draw和onDraw方法的一点心得
1.View绘制过程的传递是通过dispatchDraw来实现的,dispatchDraw调用子view的draw方法,draw方法主要有这几步:(1)绘制背景background.draw(canvas)(2)绘制自己onDraw(3)绘制children(dispatchDraw)(4)绘制装饰(onDrawScrollBars)这样draw方法调用dispatchDraw...原创 2019-12-04 14:50:03 · 509 阅读 · 0 评论 -
Android paint和canvas的API应用
1.canvas的save()和restore()2.canvas的rotate()(1)rotate(90)这个方法是针对于x和y坐标的(0,0)点的,x和y轴是会跟着旋转(2)rotate(90,x,y)这个方法是绕x,y点旋转的,x、y轴也会跟着旋转rotate旋转的是坐标系,影响的是以后的绘画逻辑,已有的内容并不会跟随旋转3.canvas的drawA...原创 2019-11-27 10:15:20 · 140 阅读 · 0 评论 -
实现简单的ScrollView和熟悉一些API
先上代码:public class MyScrollView extends ViewGroup { public MyScrollView(Context context) { this(context,null); } public MyScrollView(Context context, AttributeSet attrs) { ...原创 2019-11-27 10:12:07 · 184 阅读 · 0 评论 -
版本升级到6.0、7.0、8.0之上出现的问题
一、android:7.0系统共享文件权限7.0系统,不再将应用程序的私有程序向使用者放宽,随之带来的就是你的App对外无法暴露file://类型的URI了;如果继续使用intent携带file://类型的uri去访问其他应用,比如说相机、安装apk等则会抛出FileUriExposedException异常;解决办法: <provider ...原创 2019-11-21 16:18:42 · 590 阅读 · 0 评论 -
Android 群英传学习笔记----学习总结
注意:安卓坐标系和普通坐标系不同1.Canvas与bitmap我们平时用的canvas其实不是直接画在画布上,而是画在canvas装载的bitmap上,这个bitmap用来存储所有绘制在canvas上的像素信息,所以当我们装载了bitmap后,后面调用的Canvas.drawXXX方法都是发生在这个bitmap上的,这时如果你在其他地方改变这个bitmap,画布上也会变化。2.View...原创 2019-11-21 16:14:16 · 171 阅读 · 0 评论 -
SurfaceView
1.为什么用SurfaceView:SurfaceView比View更适用于频繁刷新,surfaceview通常会通过一个子线程来进行页面刷新,View会直接在主线程中对画面进行刷新。所以当我们的自定义View需要频繁刷新,或者刷新时数据处理量比较大就可以考虑使用surfaceview来代替View。2.模版:public class MySurfaceView extends Surf...原创 2019-11-21 14:32:01 · 157 阅读 · 0 评论 -
读Android事件分发机制详解:史上最全面、最易懂文章之后解惑
超级好文:https://www.jianshu.com/p/38015afcdb58问题一:事件传递的节点代码是啥?即activity如何把事件传递给ViewGrope,ViewGrope如何把事件传递给View?具体代码1.activity传给ViewGrope:activity的dispatchTouchEvent()调用getWindow().superDispatchTouc...原创 2019-11-15 17:01:21 · 185 阅读 · 0 评论 -
简单实现ViewPager和熟悉一些api
先上代码:public class MyViewPager extends ViewGroup { public MyViewPager(Context context) { this(context,null); } public MyViewPager(Context context, AttributeSet attrs) { ...原创 2019-11-15 10:48:45 · 249 阅读 · 0 评论 -
android requestLayout、invalidate与postInvalidate
原文:https://blog.csdn.net/a553181867/article/details/51583060requestLayout1.当我们动态移动一个View的位置,或者View的大小、形状发生了变化的时候,我们可以在view中调用这个方法,即:view.requestLayout();2.在requestLayout方法中,首先先判断当前View树是否正在布局流...原创 2019-11-11 17:03:04 · 499 阅读 · 0 评论 -
android的activity加载和显示流程
https://blog.csdn.net/gaoxiaoweiandy/article/details/96751904https://blog.csdn.net/jiang19921002/article/details/78977560https://blog.csdn.net/lz8362/article/details/798380151.一个Activity启动后,首先实例...原创 2019-11-06 17:34:58 · 470 阅读 · 0 评论 -
自定义View对layout、onLayout的一点心得
https://blog.csdn.net/dmk877/article/details/49632959https://blog.csdn.net/a396901990/article/details/38129669推荐大家把第一个小例子做一下:public class MyViewGrop extends ViewGroup { int scrrenWid...原创 2019-11-01 16:58:11 · 439 阅读 · 0 评论