前言

目录

1. 方法数超过65K,合并

  • a.引入jar包
    1
    implementation "com.android.support:multidex:1.0.3"
  • b.配置合并dex为开启
    1
    2
    3
    defaultConfig {
    multiDexEnabled true
    }
  • c.在自己的MyApplication下的方法中初始化
    1
    2
    3
    4
    5
    @Override
    protected void attachBaseContext(Context base) {
    super.attachBaseContext(base);
    MultiDex.install(this);
    }

    2. RecyclerView滚动监听

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    //RecyclerView滚动监听
    recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
    @Override
    public void onScrollStateChanged(@NonNull RecyclerView recyclerView, int newState) {
    super.onScrollStateChanged(recyclerView, newState);
    switch (newState){
    case RecyclerView.SCROLL_STATE_IDLE://现在不是滚动状态
    L.e("滚动的距离=="+direction);
    break;
    case RecyclerView.SCROLL_STATE_DRAGGING://手指 拖动
    break;
    case RecyclerView.SCROLL_STATE_SETTLING://惯性滚动
    break;
    }
    }

    @Override
    public void onScrolled(@NonNull RecyclerView recyclerView, int dx, int dy) {
    super.onScrolled(recyclerView, dx, dy);
    //计算RecyclerView滚动的距离
    direction += dy;
    }
    });

3. TextView

  • 增加下划线
    1
    tv.getPaint().setFlags(Paint.STRIKE_THRU_TEXT_FLAG);
  • 代码添加左侧图片
    1
    2
    3
    4
    Drawable img = layout.getResources().getDrawable(R.drawable.icon);  
    // 调用setCompoundDrawables时,必须调用Drawable.setBounds()方法,否则图片不显示
    img.setBounds(0, 0, img.getMinimumWidth(), img.getMinimumHeight());
    textView.setCompoundDrawables(img, null, null, null); //设置左图标
  • 文字滚动消息
    1
    2
    3
    4
    5
    6
    7
    8
    9
    < TextView
    android:layout_width ="wrap_content"
    android:layout_height ="wrap_content"
    android:focusable ="true"
    android:focusableInTouchMode ="true"
    android:marqueeRepeatLimit ="marquee_forever"
    android:ellipsize ="marquee"
    android:singleLine ="true"
    android:text ="那么什么是成功的人生,什么样的人又是成功人士呢?像科技界的比尔?盖茨 ,乔布斯 ,商界的巴菲特以及娱乐、体育界的大腕,无疑会被人们视为是成功者。但对于普通民众,如果用比尔?盖茨那样的标准来衡量是否成功似乎有些太苛刻,也不现实。在某种观念中,一个人的成功似乎与财富分不开的。很多国人到美国看到华人最常说的一句话是,你是个成功人士。为什么这么说?因为你能住300平方米、价值百万美元的房子,因为你开的车是奔驰 、宝马等豪华车,因为你有好的工作,年薪至少在10万美元以上。这也许是很多国人看待一个人成功与否的主要标志。但在美国人眼里,成功并不是与拥有众多财富密不可分。在1980年代,多数美国人把拥有更多财富看成人生成功的一个主要标志。而在一项最新的调查中,对于美国人来说,财富不再是成功的最重要组成部分。调查中22个成功人生的潜在组成因素中,“有很多钱”仅排名在第20位。" />
  • 可滚动方式
    1
    2
    3
    4
    5
    // xml中设置TextView属性
    android:scrollbars="vertical"

    // 同时代码中设置
    textView.setMovementMethod(ScrollingMovementMethod.getInstance());

4. EditText变搜索按钮,并监听搜索事件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
//xml中设置android:imeOptions="actionSearch"且android:singleLine="true"

etSearch.setOnEditorActionListener(new TextView.OnEditorActionListener() {
@Override
public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
if (actionId == EditorInfo.IME_ACTION_SEARCH){
String keyWord = v.getText().toString();
if (TextUtils.isEmpty(keyWord)){
ToastUtil.showLong("请输入搜索内容!");
return false;
}
//开始搜索keyWord相关内容
}
return false;
}
});

5. 通过Glide保存图片到本地,并同步到相册

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
42
43
44
45
46
47
48
49
50
51
52
save.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Glide.with(itemActivity.this)
.asBitmap()
.load(url)
.into(new SimpleTarget<Bitmap>() {
@Override
public void onResourceReady(@NonNull Bitmap resource, @Nullable Transition<? super Bitmap> transition) {
saveImage(resource);
}
});

}
});

private void saveImage(Bitmap image) {
String saveImagePath = null;
Random random = new Random();
String imageFileName = "JPEG_" + "down" + random.nextInt(10) + ".jpg";
File storageDir = new File(Environment.getExternalStoragePublicDirectory
(Environment.DIRECTORY_PICTURES) + "test");

boolean success = true;
if(!storageDir.exists()){
success = storageDir.mkdirs();
}
if(success){
File imageFile = new File(storageDir, imageFileName);
saveImagePath = imageFile.getAbsolutePath();
try {
OutputStream fout = new FileOutputStream(imageFile);
image.compress(Bitmap.CompressFormat.JPEG, 100, fout);
fout.close();
} catch (Exception e) {
e.printStackTrace();
}

// Add the image to the system gallery
galleryAddPic(saveImagePath);
Toast.makeText(mContext, "IMAGE SAVED", Toast.LENGTH_LONG).show();
}
// return saveImagePath;
}

private void galleryAddPic(String imagePath) {
Intent mediaScanIntent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);
File f = new File(imagePath);
Uri contentUri = Uri.fromFile(f);
mediaScanIntent.setData(contentUri);
sendBroadcast(mediaScanIntent);
}

6. 调用系统分享(不使用第三方),指定QQ、微信等

https://blog.csdn.net/u010356768/article/details/78246691
qq空间限制:
https://blog.csdn.net/weixin_41239127/article/details/78743421

7. Retrofit上传图片

1
2
3
4
5
 MultipartBody.Builder builder = new MultipartBody.Builder();
builder.setType(MultipartBody.FORM);
File file = new File(photoPath);
builder.addFormDataPart("files", file.getName(), RequestBody.create(MediaType.parse("image/*"), file));
MultipartBody body = builder.build();

8. 自定义View实践十六式

https://me.csdn.net/u011387817

9. 再次点击退出程序

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
@Override
public void onBackPressed() {
if (!mBackKeyPressed) {
Toast.makeText(this, "再按一次退出", Toast.LENGTH_SHORT).show();
mBackKeyPressed = true;
new Timer().schedule(new TimerTask() {
@Override
public void run() {
mBackKeyPressed = false;
}
}, 2000);
} else {//退出程序
finish();
}
}

10. 关于android中的armeabi、armeabi-v7a、arm64-v8a及x86等

如果项目只包含了 armeabi,那么在所有Android设备都可以运行;
如果项目只包含了 armeabi-v7a,除armeabi架构的设备外都可以运行;

如果项目只包含了 x86,那么armeabi架构和armeabi-v7a的Android设备是无法运行的; 如果同时包含了 armeabi, armeabi-v7a和x86,所有设备都可以运行,程序在运行的时候去加载不同平台对应的so,这是较为完美的一种解决方案,同时也会导致包变大。
https://www.jianshu.com/p/f29ad4beef59

11. 背景高斯模糊

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
private Bitmap applyBlur() {
Bitmap bitmap = ScreenUtils.snapShotWithStatusBar(this.getActivity());
return blur(bitmap);
}
@TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR1)
private Bitmap blur(Bitmap bkg) {
long startMs = System.currentTimeMillis();
float radius = 1;
bkg = small(bkg);
Bitmap bitmap = bkg.copy(bkg.getConfig(), true);

final RenderScript rs = RenderScript.create(this.getContext());
final Allocation input = Allocation.createFromBitmap(rs, bkg, Allocation.MipmapControl.MIPMAP_NONE,
Allocation.USAGE_SCRIPT);
final Allocation output = Allocation.createTyped(rs, input.getType());
final ScriptIntrinsicBlur script = ScriptIntrinsicBlur.create(rs, Element.U8_4(rs));
script.setRadius(radius);
script.setInput(input);
script.forEach(output);
output.copyTo(bitmap);

bitmap = big(bitmap);
MainActivity.ivCover.setBackground(new BitmapDrawable(getResources(), bitmap));
rs.destroy();
Log.d("zhangle","blur take away:" + (System.currentTimeMillis() - startMs )+ "ms");
return bitmap;
}

private static Bitmap big(Bitmap bitmap) {
Matrix matrix = new Matrix();
matrix.postScale(4f,4f); //长和宽放大缩小的比例
Bitmap resizeBmp = Bitmap.createBitmap(bitmap,0,0,bitmap.getWidth(),bitmap.getHeight(),matrix,true);
return resizeBmp;
}

private static Bitmap small(Bitmap bitmap) {
Matrix matrix = new Matrix();
matrix.postScale(0.25f,0.25f); //长和宽放大缩小的比例
Bitmap resizeBmp = Bitmap.createBitmap(bitmap,0,0,bitmap.getWidth(),bitmap.getHeight(),matrix,true);
return resizeBmp;
}

12. Android TextView加上阴影效果

https://blog.csdn.net/hewence1/article/details/39993415

13. 用SpannableString打造绚丽多彩的文本显示效果

https://www.jianshu.com/p/84067ad289d2