
Android
文章平均质量分 77
mChenys
这个作者很懒,什么都没留下…
展开
-
Android踩坑小记(持续更新)
点9图的非内容区域也是会占用实际宽高的.点9图的上边和左边是限定拉伸区域,下边和右边是限定内容显示区域. 在上图中内容的限制区域刚好是白色的圆角矩形内容,而用红色框框框住的这些距离其实是非内容区域, 但是如果使用该点9图的话,这些非内容区域其实也是占据空间的,也就是说就算你布局中没有设置任何的margin值,但是任然会看到该View距离四周有一点距离.2019/1/23..................原创 2019-01-23 11:14:22 · 3497 阅读 · 1 评论 -
Android实用小技巧(持续更新)
文章目录给drawableRight设置点击事件限制EditText可输入的字数,超出后提示文案解决RecycleView布局中GridLayoutManager和StaggeredGridLayoutManager添加头部和底部不占用一行的问题解决由于RecyclerView有刷新头存在,导致canScrollVertically(-1)时始终返回true的bug获取RecycleView第一个和最后一个可见Item的位置修改RadioButton的drawableRight图片与文字相隔的距离太大,导致原创 2019-01-03 17:31:03 · 3226 阅读 · 1 评论 -
编译时注解处理器使用之Android简化findViewById和setOnClickListener的书写
标题有点长,相信用过xUtils和ButterKnife框架的都知道啥意思,他们都可以通过注解的方式省去繁琐的findViewById和setOnClickListener代码的编写。他们2者的实现原理不一样,前者用的是运行时注解,后者用的是编译时注解,对于不同的注解,会有不同的注解处理器, 针对运行时注解会采用反射机制来处理,针对编译时注解会采用AbstractProcessor来处理,相对来说...原创 2020-02-20 15:39:01 · 753 阅读 · 0 评论 -
Webview截屏三种方式
第一种方式通过调用webview.capturePicture(),得到一个picture对象,根据图像的宽和高创建一个Bitmap,再创建一个canvas,绑定bitmap,最后用picture去绘制。//获取Picture对象Picture picture = wv_capture.capturePicture();//得到图片的宽和高(没有reflect图片内容)int width...转载 2019-09-06 17:07:34 · 557 阅读 · 0 评论 -
Android通知栏微技巧,8.0系统中通知栏的适配
为什么要进行通知栏适配?不得不说,通知栏真是一个让人又爱又恨的东西。通知栏是Android系统原创的一个功能,虽说乔布斯一直认为Android系统是彻彻底底抄袭iOS的一个产品,但是通知栏确实是Android系统原创的,反而苹果在iOS 5之后也加入了类似的通知栏功能。通知栏的设计确实非常巧妙,它默认情况下不占用任何空间,只有当用户需要的时候用手指在状态栏上向下滑动,通知栏的内容才会显示出来...转载 2019-09-05 18:39:44 · 277 阅读 · 0 评论 -
命令模式下启动uiautomator测试类
默认情况下,用as创建完项目后,会有这3部分组成同时app目录下的build.gradle文件多了这些东西今天介绍的uiautomator是属于自动化测试部分的,uiautomator可以实现跨应用间的UI自动化操作(例如点击,滑动,输入内容等等)关于自动化代码的编写,这里不详细介绍.要使用uiautomator,还需要引入依赖包androidTestCompile 'com.andr...原创 2019-01-30 16:52:01 · 1817 阅读 · 0 评论 -
android在apk中获取root权限,并执行命令
在apk中,有时候需要root权限,例如通过apk更新系统库等system的文件等,避免升级固件,或者在apk中需要直接访问某些设备等。下面是在apk中获取root权限的方法,前提是设备已经root过了。//通过执行su产生一个具有root权限的进程Process p = Runtime.getRuntime().exec("su");//然后,在向这个进程的写入要执行的命令,即可达到以ro...原创 2019-01-30 11:56:43 · 9651 阅读 · 4 评论 -
ConstraintLayout不常用的属性
Chains链使我们能够对一组在水平或竖直方向互相关联的控件的属性进行统一管理。成为链条的条件:一组控件之间通过一个双向的约束关系链接起来,并且链的属性由一条链的头结点控制,如下图所示:布局如下:<?xml version="1.0" encoding="utf-8"?><android.support.constraint.Constrain原创 2019-01-10 17:06:32 · 2123 阅读 · 0 评论 -
修改FlowLayout源码,让其支持设置最大行数
这里所说的FlowLayout组件是来自鸿洋提供的一个流式布局的框架源码看这里博客介绍看这里废话不多说,直接上代码,主要就是修改FlowLayout的onMeasure和onLayout方法,同时我这里还对onLayout方法优化了一下,减少了一次for循环处理行view,行高,行宽等信息public class FlowLayout extends ViewGroup { pri...原创 2019-01-09 12:25:54 · 2430 阅读 · 4 评论 -
解决ViewPager展示Fragment时重新设置setAdapter不会重置Fragment的bug
用过ListView和RecycleView的人都知道不管当前列表的浏览记录在哪里,只要重新setAdapter,列表就会重置,即从第一条item开始显示.因此,想当然的我也就认为ViewPager也是这个样子的.结果并不是我想的那么简单,重复setAdapter并没什么卵用,Fragment的状态还是上一次所看到的样子,并没有重新初始化,Fragment的几什么周期方法一个都没有运行…实在无语...原创 2019-01-07 22:56:15 · 4732 阅读 · 5 评论 -
修改原生Switch组件的样式
通过修改Switch组件的布局属性来修改样式,今天要实现下图所示的2种状态主要是通过设置track和thumb这2个属性,前者是设置开关的背景图,后者是设置开关的滑块图.先来看看switch组件的使用<Switch android:layout_width="wrap_content" android:layout_height="wrap_content" a...原创 2018-12-27 11:04:39 · 2176 阅读 · 2 评论 -
通过透明Activity来展示新手指引蒙层
上一篇文章介绍了通过Dialog的方式来处理蒙层详情,但是使用的时候还是有局限性,由于dialog是要依附于某个具体的Activity才能弹出显示的,当依附的Activity finish后Dialog也会跟着消失,对于一些特定的需求当依附的Activity消失后仍需要显示蒙层,只有用户点击了蒙层才能消失就不能使用Dialog这种方式了.解决这个问题,我这里想到的是通过Activity来处理,...原创 2018-10-31 11:19:04 · 834 阅读 · 0 评论 -
通过Dialog来展示新手指引蒙层
以前展示新手指引蒙层的方式都是在Activity基类的根布局中叠加上一个全屏的ImageView,然后在条件成立的时候设置蒙层并显示,这里介绍一种通过Dialog来展示的方式,用起来比较灵活.先看dialog的布局,其实就是一个ImageView<?xml version="1.0" encoding="utf-8"?><android.support.constra...原创 2018-10-30 21:37:47 · 1090 阅读 · 0 评论 -
Android自定义状态选择器属性
其实,android已经给我们提供了比较丰富的状态选择器属性了,比如android:state_checked、android:state_pressed、android:state_selected、android:state_enabled等等,相信大家都不陌生,我今天要介绍的并不是如何使用这些属性,而是教大家如何创建自定义的状态属性。比如我要创建定义一个名字叫state_on的属性,值是一个布原创 2018-04-26 17:18:21 · 1854 阅读 · 0 评论 -
Android7.0调用系统相机和裁剪
最近将项目的targetSdkVersion升级到了26,发现调用系统相机的时候报了下面这个错误: android.os.FileUriExposedException: file:///storage/emulated/0/Android/data/blog.youkuaiyun.com.mchenys/cache/output_image.jpg exposed beyond app through C原创 2018-04-25 18:08:21 · 4687 阅读 · 2 评论 -
Android NestedScrolling 的使用
自从Lollipop开始,谷歌给我们带来了一套全新的嵌套滑动机制 - NestedScrolling来实现一些普通情况下不容易办到的滑动效果。Lollipop及以上版本的所有View都已经支持了这套机制,Lollipop之前版本可以通过Support包进行向前兼容。它和我们已熟知的dispatchTouchEvent不太一样。 我们先来看传统的事件分发,它是由父View发起,一旦父V...原创 2018-04-22 19:05:38 · 1400 阅读 · 0 评论 -
如何让webview支持文件上传
android webview默认是不支持文件上传功能的,需要借助WebChromeClient来实现. 继承WebChromeClient后,重写openFileChooser和onShowFileChooser这2个方法.Android3.0以下的SDK,openFileChooser仅有一个参数: openFileChooser(ValueCallback< Uri > ...原创 2018-04-03 16:14:35 · 2409 阅读 · 0 评论 -
Android4.4之后的短息插入方式
android4.4之前,我们可以通过下面的代码,往手机写入一条短息: public static void createMsg(Context context, String phone, String msg) { ContentResolver resolver = context.getContentResolver(); Uri uri = Uri.parse("con原创 2018-03-15 15:33:09 · 743 阅读 · 0 评论 -
Android平板兼容
1.布局兼容 res文件夹下新建layout-large文件夹(7寸)或者layout-xlarge文件夹(大于7寸),里面的布局文件和layout文件夹的一样.例如activity_main.xml. 假设pad在layout-large和layout-xlarge的布局是这样的:<?xml version="1.0" encoding="utf-8"?><LinearLayout原创 2017-04-08 11:29:18 · 997 阅读 · 0 评论 -
RecycleView实现拖拽交换item位置
老规矩,先来一张效果图:相比起ListView而言,RecycleView实现拖拽交换位置的效果要简单很多,因为通过SDK中的ItemTouchHelper工具类可以轻松的实现这种效果,并且一套代码支持所有布局方式;而ListView的话则需要通过生成View的缓存镜像设置到ImageView中,然后通过WindowManager来操作该ImageView,具体怎么实现这里就不展开讲解了.回归到It原创 2017-02-16 15:42:22 · 9007 阅读 · 9 评论 -
整合Camera和MediaRecorder实现拍照和录像
年末最后一篇文章,明天就可以回家过年了.今天带来的效果如下图所示: 效果图看到的拍照和摄像其实是一个自定义的SurfaceView,在里面实现了拍照和散光灯切换,前后摄像头切换,录像的功能,以及定时录制的功能.下面直接贴出完整代码,关键部分都加上了注释,相信都能看懂的.public class RecordView extends SurfaceView implements MediaR原创 2017-01-26 12:12:25 · 4764 阅读 · 1 评论 -
ViewPager的高度根据item的高度自适应
今天遇到一个坑爹的需求,需求如题,就是想实现ViewPager在切换的时候自身的高度随itemView的高度调整. 使用过ViewPager的人都知道,即使你在布局中写的高度是wrap_content,但是运行起来就会发现他其实是match_parent的效果,也就是填充整个屏幕,除非你写死一个高度. 解决这个问题,那就只能自定义一个View继承ViewPager然后重写onMeasure方法了原创 2017-01-11 23:04:34 · 9747 阅读 · 11 评论 -
Lambda表达式
Lambda表达式是JDK1.8的新特性,使用Lambda表达式可以极大的简化匿名内部类的书写,Lambda表达式最低可以兼容Android2.3系统,做过Android开发的人都知道,匿名内部类的使用太平常和频繁不过了,随随便便添加一个监听事件就会用到,开启个子线程也会用到,自定义一个回调接口也会用到.那么如果使用Lambda表达式将会带来哪些书写方面的简便呢? 它可以让你的匿名函数省去书写ne原创 2016-12-16 14:38:32 · 584 阅读 · 0 评论 -
浅谈自定义View的宽高获取
自定义View的时候经常少不了获取View的宽高信息,当然不一定是自定义View的时候才会需要获取宽高信息,其他情况下我们也会有这样的需求,获取方式和获取的时机也十分讲究.下面分别从这几个api讲起:1.构造方法2.onFinishInflate3.onSizeChanged4.onMeasure5.onWindowFocusChanged6.onLayout7.Vie原创 2016-11-25 17:32:35 · 26027 阅读 · 5 评论 -
Android自带的emoji表情的使用
什么是emoji表情emoji表情是一种表情符号,在代码中它现在其实是一组遵循Unicode的编码,即每一个表情符号都对应了一个Unicode编码。更进一步说,emoji表情实际上是一组Unicode编码与一组表情描述之间的对应。注意,这里所说的不是表情图片,而是表情描述。那么图片的实现是由谁来负责的呢?图片是由各个系统或者软件针对统一的表情描述来各自实现的,他们都遵循统一的Unicode编码规范。原创 2016-10-15 16:03:57 · 9946 阅读 · 5 评论 -
下载进度的监听和通知的处理
下载管理器关于下载进度的监听,这个比较简单,以apk文件下载为例,需要处理3个回调函数,分别是: 1.下载中 2.下载成功 3.下载失败 因此对应的回调接口就有了:public interface DownloadCallback { /** * 下载成功 * @param file 目标文件 */ void onComplete(File fi原创 2016-10-09 20:53:33 · 2446 阅读 · 0 评论 -
修改状态栏颜色
本文介绍的修改状态颜色的方法仅支持android4.4及以上系统,操作大致分为2个步骤: 1.将状态栏透明化 2.覆盖透明的状态栏效果图: 状态栏透明化可通过代码设置,一般写在BaseActivity中,例如://5.0及以上if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { View原创 2016-10-09 16:41:50 · 975 阅读 · 0 评论 -
优雅的多击事件处理
通过数组移位的方式来记录每次点击目标控件的时间(距离系统开机的时间),然后取数组0索引位置的时间与当前系统的开机时间减去某个时间戳做对比,如果大于该相减的结果,则完成了该多击事件. 代码非常简单,以3击事件为例long[] mHits = new long[3];//3击事件,数组长度为3,n击事件则长度为nview.setOnClickListener(new OnClickListener(原创 2016-08-24 22:52:42 · 837 阅读 · 0 评论 -
WindowManager操作View示例
通过WindowManager可以在当前窗体中添加和删除View,本示例是在窗体中添加一个Button,并且手指移动Button可以控制其在窗体中任意移动. 代码很简单,直接上代码public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedIns原创 2016-08-23 22:32:20 · 1118 阅读 · 0 评论 -
监听来电和去电号码
通过TelephonyManager可以监听电话的来电,占线和空闲状态,分别对应如下三个常量:/** Device call state: No activity. */public static final int CALL_STATE_IDLE = 0;/** Device call state: Ringing. A new call arrived and is * ringing原创 2016-08-22 21:49:25 · 1454 阅读 · 0 评论 -
CollapsingToolbarLayout的使用
CollapsingToolbarLayout作用是提供了一个可以折叠的Toolbar,它继承至FrameLayout,给它设置layout_scrollFlags,它可以控制包含在CollapsingToolbarLayout中的控件(如:ImageView、Toolbar)在响应layout_behavior事件时作出相应的scrollFlags滚动事件(移除屏幕或固定在屏幕顶端)。今天要实现的原创 2016-05-31 11:38:14 · 6096 阅读 · 5 评论 -
NestedScrollView的使用
在上一篇文章中,我们了解了CoordinatorLayout的使用,它可以让ToolBar随RecycleView的滑动滑入和划出屏幕,但是在一些其它场景下,我们不一定会用到RecycleView,假设我们只是想显示几个item而已,那该如何解决呢 ?我们可以使用NestedScrollView来解决,它是support-v4包提供的控件,继承至FrameLayout, 并实现了NestedScr原创 2016-05-30 21:27:50 · 50420 阅读 · 3 评论 -
CoordinatorLayout配合AppBarLayout,Toolbar和TabLayout的使用
关于Toolbar和TabLayout的使用,如果不了解的话,可以先看看者两篇文章: ToolBar的使用 TabLayout的使用今天要实现的效果如下图所示: 当ToolBar滚出屏幕的时候,TabLayout固定在屏幕顶部,然后下滑的时候在划出Toolbar.先来介绍下AppBarLayout控件,它是继承LinerLayout实现的一个ViewGroup容器组件,是为了Materi原创 2016-05-29 23:17:13 · 11431 阅读 · 5 评论 -
ToolBar的使用
ToolBar的出现是为了替换之前的ActionBar的各种不灵活使用方式,相反,ToolBar的使用变得非常灵活,因为它可以让我们自由往里面添加子控件.低版本要使用的话,可以添加support-v7包. 今天要实现的效果如下: 由上图可以看到,toolBar的布局还是相对丰富的.要使用toolBar,首先为了兼容低版本,需要在gradle中引入支持库compile 'com.android.s原创 2016-05-29 20:22:30 · 44928 阅读 · 4 评论 -
TabLayout的使用
TabLayout是design库提供的控件,可以方便的使用指示器,功能类似ViewPagerIndicator. 使用非常方便,Android Studio只需要在gradle中引入即可使用 .compile 'com.android.support:design:23.3.0'TabLayout即可以单独使用,也可以配合ViewPager来使用. 先来看看单独使用的Demo,实现如下图的效果...原创 2016-05-29 13:43:22 · 9163 阅读 · 3 评论 -
FragmentTabHost的使用
FragmentTabHost是support-v包下提供的用于集成和管理Fragment页面的组件. 今天要实现的效果图如下: 整体结构是MainActivity+5个模块的Fragment. MainActivity的布局如下:<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android...原创 2016-05-28 10:31:39 · 1003 阅读 · 0 评论 -
自定义通知栏布局
效果图:通知栏布局custom_notification.xml<?xml version="1.0" encoding="utf-8"?><LinearLayout android:id="@+id/ll_root" xmlns:android="http://schemas.android.com/apk/res/android" android:layout_widt原创 2016-04-04 15:27:30 · 4961 阅读 · 0 评论 -
Messenger实现Activity与Service的双向通信
Activity与Service间的单向通信,相信大家都知道,常用的有下面3种方式: 1. 通过bindService(service, conn, BIND_AUTO_CREATE)开启Service,然后在ServiceConnection的onServiceConnected回调方法中获取到Service引用,然后我们就可以访问Service中的方法了. 2. 通过broadcast(广播原创 2016-03-09 18:24:17 · 745 阅读 · 0 评论 -
通过ValueAnimator实现点击展开和关闭的效果
效果图如下:由于这个界面实现的代码比较多,这里就不一一贴出了,这里主要把涉及到"展开和收起动画"相关的代码和实现思路介绍下.思路:通过ValueAnimator属性动画的ofInt(int... values) 方法,接收的是一个int类型的可变参数,我们只需要传入一个起始高度和一个终止时的高度即可构建一个ValueAnimator对象,有了这个对象,我们就可以做很多操原创 2016-01-23 17:58:23 · 3552 阅读 · 1 评论 -
通过BaseHolder的方式展示数据
关于BaseHolder的介绍,大家可以看这篇文章对BaseAdapter和ViewHolder的封装想必大家一定会问,BaseAdapter和ViewHolder不是用来实现对ListView列表展示数据的优化吗,跟今天要说的展示数据有什么关系?没错,BaseAdapter确实和今天要说的内容没有什么关系,但是ViewHolder就有关系了,这个东西不但可以用来优化ListVie原创 2016-01-23 16:03:35 · 1075 阅读 · 1 评论