0%

SharedPreferences 作为Android常用的存储方式,它适合存储小数据量,特别是键值对数据。
原理的文章可以参考:
深入理解Android中的SharedPreferences
SharedPreferences源码解析
细节绘图就不上了,这里会从Android 9.0的源码去重新捋一遍过程,也算是自我的学习review。

SharedPreferences 接口

SharedPreferences是一个接口,其中包含了Editor接口与OnSharedPreferenceChangeListener接口

阅读全文 »

开发的过程中,遇到了一个问题:如何使ScrollBar往里面缩10dp,而不影响下面内容的展示?

在官方的控件中没有可以使用的api,那只能看源码了。

主要的绘制放在View的onDrawScrollBars方法里面,主要是下面的方法调用:

1
onDrawVerticalScrollBar(canvas, scrollBar, left, top, right, bottom);

然后我们发现,这个方法是protected的:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
/**
* <p>Draw the vertical scrollbar if {@link #isVerticalScrollBarEnabled()}
* returns true.</p>
*
* @param canvas the canvas on which to draw the scrollbar
* @param scrollBar the scrollbar's drawable
*
* @see #isVerticalScrollBarEnabled()
* @see #computeVerticalScrollRange()
* @see #computeVerticalScrollExtent()
* @see #computeVerticalScrollOffset()
* @see android.widget.ScrollBarDrawable
* @hide
*/
protected void onDrawVerticalScrollBar(Canvas canvas, Drawable scrollBar,
int l, int t, int r, int b) {
scrollBar.setBounds(l, t, r, b);
scrollBar.draw(canvas);
}

那么,一个简单的方式,就是自定义一个子类继承ScrollView或ListView。重写onDrawVerticalScrollBar方法:

1
2
3
4
5
6
7
@Override
protected void onDrawVerticalScrollBar(Canvas canvas, Drawable scrollBar, int l, int t, int r, int b) {
canvas.save();
canvas.translate(-mScrollBarPaddingRight, 0);
super.onDrawVerticalScrollBar(canvas, scrollBar, l, t, r, b);
canvas.restore();
}

然后使用这个自定义控件,那么ScrollBar就能如我们所愿缩进啦。记得要设ScrollBarStyle为insideOverlay

关于Hexo的教程网上一搜一大堆,本文记录下自己安装Hexo的过程,以备不时之需。

我使用的是hexo与github的结合,就冲着github提供的免费空间去滴。

目前,在github上搭建博客系统使用最多就是Hexo和Jekyll。Hexo是基于Nodejs开发的,Jekyll是基于Ruby开发的。

图库

使用七牛云存储图片。

参考文献

手把手教从零开始在GitHub上使用Hexo搭建博客教程(一)-附GitHub注册及配置

在Android中,我们可以使用ContentObserver监听ContentProvider数据的变化。

实例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
mPhotoObserver = new PhotoObserver(new Handler());
// 注册观察者
getContentResolver().registerContentObserver(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, true, mPhotoObserver);


// 监听图片变化
class PhotoObserver extends ContentObserver {
public PhotoObserver(Handler handler) {
super(handler);
}

@Override
public void onChange(boolean selfChange) {

}

@Override
public void onChange(boolean selfChange, Uri uri) {
Log.d("image onChange", selfChange + ", " + uri);

//查询出第一条记录
Cursor c = getContentResolver().query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, null, null, null, "_id DESC LIMIT 1");
// Cursor c = getContentResolver().query(uri, null, null, null, "_id DESC LIMIT 1");
if (c.moveToNext()) {
int imageId = c.getInt((c.getColumnIndex(MediaStore.Images.Media._ID)));
String title = c.getString(c.getColumnIndex(MediaStore.Files.FileColumns.DATA));
Bitmap bm = MediaStore.Images.Thumbnails.getThumbnail(getContentResolver(),
imageId, MediaStore.Images.Thumbnails.MINI_KIND, null);

Toast toast = Toast.makeText(MainActivity.this, "刚才的IMG :" + title, Toast.LENGTH_SHORT);
toast.setGravity(Gravity.CENTER, 20, 69);
LinearLayout linearLayout = (LinearLayout) toast.getView();
ImageView imageView = new ImageView(MainActivity.this);
imageView.setImageBitmap(bm);
linearLayout.addView(imageView, 1);
toast.setView(linearLayout);
toast.show();
}
c.close();
}
}
阅读全文 »

AccessibilityService是Android中的无障碍功能,可以用来监听屏幕事件。
关于AccessibilityService的使用:参考 Building Accessibility Services

在Android6.0(API 23)以上,会要求动态权限的授予,此时系统会弹出提示框,我们如何自动跳过授予这些权限呢,一种方式使模拟点击,即本文的方法。

阅读全文 »

在现在版本手Q的功能当中,可以提供在锁屏时直接回复的功能。如图所示

QQ实现了在收到消息的时候,自动把屏幕置亮,并提供快捷回复的操作。
那么,我们就研究下该功能是如何实现的。

阅读全文 »

在Linux系统中,使用inotify监控文件的变更。Android在这个基础上封装了一个FileObserver类来方便使用inotify机制。FileObserver是一个抽象类,需要定义子类实现该类的onEvent抽象方法,当被监控的文件或者目录发生变更事件时,将回调FileObserver的onEvent()函数来处理文件或目录的变更事件。

阅读全文 »