前言
Gilde框架用起来爽的不行,啊,pong友们可以百度了解、XIO习一下
初识图片加载框架——Glide的简单用法
前端代码
1.activity_main.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/main2_bg"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center">
<Button
android:id="@+id/btn_wallpaper"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="背景切换" />
</LinearLaout>
2.创建一个activity_wallpaper.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:orientation="vertical">
<ImageView
android:id="@+id/image_choose"
android:layout_width="100dp"
android:layout_height="80dp"
android:background="#C97CCF"/>
<Button
android:id="@+id/btn_sure"
android:layout_width="80dp"
android:layout_height="30dp"
android:layout_marginTop="10dp"
android:textColor="@color/white"
android:background="#3F8798"
android:text="确定"
android:textSize="15dp"
android:textStyle="bold" />
</LinearLayout>
后端代码
1.在build.gradle里导入Glide框架(可忽略,我写了两种方法)
//Glide框架
implementation 'com.github.bumptech.glide:glide:3.7.0'
2.创建一个WallpaperActivity.java
package com.example.firstproject;
import android.content.Intent;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.provider.MediaStore;
import android.view.View;
import android.view.WindowManager;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.Toast;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import com.bumptech.glide.Glide;
import com.example.firstproject.util.SharedPreferencesUtil;
/**
* app背景切换界面
*/
public class WallpaperActivity extends AppCompatActivity implements View.OnClickListener {
private ImageView image_choose;
private Button btn_sure;
public static final int RC_CHOOSE_PHOTO = 2;
private Uri uri;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_wallpaper);
init();
}
/**
* 绑定UI组件
*/
public void init() {
//
image_choose = (ImageView) findViewById(R.id.image_choose);
image_choose.setOnClickListener(this);
btn_sure = (Button) findViewById(R.id.btn_sure);
btn_sure.setOnClickListener(this);
}
/**
* 点击事件
*
* @param view 切换背景界面
*/
@Override
public void onClick(View view) {
switch (view.getId()) {
case R.id.image_choose:
//访问相册
Intent intentToPickPic = new Intent(Intent.ACTION_PICK, null);
intentToPickPic.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, "image/*");
startActivityForResult(intentToPickPic, RC_CHOOSE_PHOTO);
break;
case R.id.btn_sure:
//使用SharedPreferences存入选取图片的路径
SharedPreferences sp = this.getSharedPreferences("Key", Context.MODE_PRIVATE);
sp.edit().putString("wallPaper", String.valueOf(uri)).apply(); //存入名字和内容
//如果根据我的上一篇文章有SharedPreferencesUtil类的话,可以使用setValue方法存值
//SharedPreferencesUtil.setValue(this, "wallPaper", String.valueOf(uri));
finish();//结束当前activity
break;
}
}
/**
* 返回选取图片的数据
*
* @param requestCode
* @param resultCode
* @param data
*/
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
switch (requestCode) {
case RC_CHOOSE_PHOTO:
try {
uri = data.getData();
//android原生
//image_choose.setImageURI(uri);
//使用Glide框架
Glide.with(this)
.load(uri) // 图片的路径
.into(image_choose); // 填充至所绑定的Image组件
} catch (Exception e) {
e.printStackTrace();
}
break;
}
}
}
3.不要忘记在AndroidMainFest.xml注册你新建的WallpaperActivity.java
<activity android:name=".WallpaperActivity"/>
4.MainActivity.java
package com.example.firstproject;
import com.bumptech.glide.Glide;
import com.bumptech.glide.load.resource.drawable.GlideDrawable;
import com.bumptech.glide.request.animation.GlideAnimation;
import com.bumptech.glide.request.target.ViewTarget;
import android.os.Bundle;
import android.widget.Button;
import android.widget.LinearLayout;
import androidx.appcompat.app.AppCompatActivity;
public class MainActivity extends AppCompatActivity implements View.OnClickListener{
private LinearLayout background;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
init();
}
//UI绑定
public void init(){
//背景切换
Button btn_wallpaper = (Button) findViewById(R.id.btn_wallpaper);
btn_wallpaper.setOnClickListener(this);
//main背景
background = (LinearLayout) findViewById(R.id.main2_bg);
}
/**
* 点击事件
* @param view main页面
*/
@Override
public void onClick(View view) {
Intent intent = new Intent();
switch (view.getId()) {
case R.id.btn_wallpaper:
//也可以用Intent intent1 = new Intent(this,WallpaperActivity.class);
intent.setClassName(this, "com.example.firstproject.WallpaperActivity"); //你对应的WallpaperActivity位置
//使用startActivityForResult进行跳转,从对应的WallpaperActivity返回时,会调用onActivityResult方法
startActivityForResult(intent, 0);
break;
}
}
/**
* 回调方法
*
* @param requestCode 传过去的值
* @param resultCode 传回来的值
* @param data 从那个activity传过来的
*/
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
/**
* 方法一
*/
String wallPaperUrl = SharedPreferencesUtil.getValue(this, "wallPaper");
//判断之前是否有更换背景,有则显示
if (!"".equals(wallPaperUrl) && wallPaperUrl != null) {
wallPaper(Uri.parse(wallPaperUrl));
}
/**
* 方法二
*/
// SharedPreferences sp = this.getSharedPreferences("Key", Context.MODE_PRIVATE);
// String wallPaperUrl = sp.getString("wallPaper",""); //存入名字和内容
// if (!"".equals(wallPaperUrl) && wallPaperUrl!= null) {
//
// wallPaper(Uri.parse(wallPaperUrl));
// }
Log.v("requestCode", String.valueOf(requestCode));
Log.v("resultCode", String.valueOf(resultCode));
}
/**
* 自定义壁纸
*/
public void wallPaper(Uri uri) {
/**
* 方法一:android原生
*/
// String[] filePathColumn = {MediaStore.Images.Media.DATA};
// Cursor cursor = getContentResolver().query(uri, filePathColumn, null, null, null);
// cursor.moveToFirst();
// int columnIndex = cursor.getColumnIndex(filePathColumn[0]);
// String path = cursor.getString(columnIndex);
// Bitmap bitmap = BitmapFactory.decodeFile(path);
// Drawable drawable = new BitmapDrawable(bitmap);
// background.setBackground(drawable);
/**
* 方法二:使用Glide框架
*/
Glide.with(this).load(uri).into(new ViewTarget<View, GlideDrawable>(background) {
//括号里为需要加载的控件
@Override
public void onResourceReady(GlideDrawable resource,
GlideAnimation<? super GlideDrawable> glideAnimation) {
this.view.setBackground(resource.getCurrent());
}
});
}
}
5.最后在AndroidMainFest.xml加上以下代码实现对相册的权限申请
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
注:android10以及android10以上版本加了这个,访问相册还是有可能会报错,提示权限问题,作者是彩笔,解决不了(有没有一种可能,这不是一回事,不管了,我也不知道,反正说是权限问题的可以看看,有其他报错可以告诉我)
可以参照这个链接解决:解决Android10版本以上外部存储权限的方案
小声BB:作者用android11的机器试了一下,还是可以访问,有丶怪。
运行结果
大概就是这样了,有什么问题可以回复我,我会的话会回复的(我不会也没有办法嘛)
歇了~