1.提取的基类
在这里插入代码片package com.example.imager_er;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
public abstract class BaseActivity extends AppCompatActivity {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(getLayoutResId());
//初始化view
initView();
//添加数据
initData();
}
protected abstract int getLayoutResId();
//初始化view
protected abstract void initView();
//添加数据
protected abstract void initData();
}
2.MainActivity主页面
package com.example.imager_er;
import android.content.Intent;
import android.database.Cursor;
import android.graphics.Bitmap;
import android.net.Uri;
import android.provider.MediaStore;
import android.support.annotation.Nullable;
import android.support.v4.content.CursorLoader;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.Toast;
import java.net.URI;
public class MainActivity extends BaseActivity {
private EditText width;
private EditText height;
private Button getImage;
private Button show;
private Uri uri;
private ImageView imageView;
private String w;
private String h;
@Override
protected int getLayoutResId() {
return R.layout.activity_main;
}
//初始化view
@Override
protected void initView() {
width = findViewById(R.id.width);
height = findViewById(R.id.height);
getImage = findViewById(R.id.get_image);
show = findViewById(R.id.show);
imageView = findViewById(R.id.image);
}
//加载数据
@Override
protected void initData() {
//点击从相册获取图片
getImage.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//打开系统相册
Intent intent = new Intent(Intent.ACTION_PICK);
//设置类型
intent.setType("image/*");
//执行
startActivityForResult(intent, 100);
}
});
//二次采样
show.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//获取输入框的值
w = width.getText().toString();
h = height.getText().toString();
if (w.equals("") || h.equals("")) {
Toast.makeText(MainActivity.this, "请输入宽,高", Toast.LENGTH_SHORT).show();
} else {
if (uri != null) {
String filePath = getUri(uri);
NetUtils.getIntance().scaleBitmap(filePath, Integer.parseInt(w),
Integer.parseInt(h), new NetUtils.CallBack() {
@Override
public void onSuccess(Bitmap bitmap) {
imageView.setImageBitmap(bitmap);
}
}
);
} else {
Toast.makeText(MainActivity.this, "请选择图片", Toast.LENGTH_SHORT).show();
}
}
}
});
}
//传入图片路径
private String getUri(Uri contentUri) {
String[] pr = {MediaStore.Images.Media.DATA};
CursorLoader loader = new CursorLoader(this, contentUri, pr, null, null, null);
Cursor cursor = loader.loadInBackground();
int index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
cursor.moveToFirst();
return cursor.getString(index);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == 100 && resultCode == RESULT_OK) {
//图片的uri
uri = data.getData();
return;
}
}
}
3.NetUtils工具类
package com.example.imager_er;
import android.annotation.SuppressLint;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.AsyncTask;
public class NetUtils {
private static NetUtils intance;
public NetUtils() {
}
public static NetUtils getIntance() {
if(intance == null){
intance = new NetUtils();
}
return intance;
}
//图片二次采样
public Bitmap scaleBitmap(String filePath,int width,int height){
//第一次直解析bitmap的宽高信息
BitmapFactory.Options op = new BitmapFactory.Options();
//指定只解析bitmap的边界信息,不加载bitmap到内存中
op.inJustDecodeBounds = true;
BitmapFactory.decodeFile(filePath,op);
//通过图片的真实宽高信息和需要的宽高产生比例
op.inSampleSize = Math.max(op.outHeight/height,op.outWidth/width);
//第二次真正加载图片
op.inJustDecodeBounds = false;
Bitmap bitmap = BitmapFactory.decodeFile(filePath,op);
return bitmap;
}
//定义接口
public interface CallBack{
void onSuccess(Bitmap bitmap);
}
@SuppressLint("StaticFieldLeak")
public void scaleBitmap(String filePath, final int width, final int height, final CallBack callBack){
new AsyncTask<String,Void,Bitmap>(){
@Override
protected Bitmap doInBackground(String... strings) {
return scaleBitmap(strings[0],width,height);
}
@Override
protected void onPostExecute(Bitmap bitmap) {
callBack.onSuccess(bitmap);
}
}.execute(filePath);
}
}
4.布局
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout 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:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<Button
android:layout_width="0dp"
android:layout_height="wrap_content"
android:text="选择图片"
android:id="@+id/get_image"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<EditText
android:id="@+id/width"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_constraintTop_toBottomOf="@id/get_image"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toLeftOf="@id/height"
android:hint="输入宽度"/>
<EditText
android:id="@+id/height"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_constraintTop_toBottomOf="@id/get_image"
app:layout_constraintLeft_toRightOf="@id/width"
app:layout_constraintRight_toRightOf="parent"
android:hint="输入高度"/>
<Button
android:id="@+id/show"
android:layout_width="0dp"
android:layout_height="wrap_content"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toBottomOf="@id/height"
android:text="生成"/>
<ImageView
android:id="@+id/image"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toBottomOf="@id/show"
app:layout_constraintBottom_toBottomOf="parent"/>
</android.support.constraint.ConstraintLayout>
5.权限
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>