项目中需要显示图片,并对图片进行缩放,于是选择了PhotoView
这里只是对本地SD卡中存储的图片进行了加载,未做网络图片加载
项目地址:https://github.com/chrisbanes/PhotoView
一、添加依赖
Gradle
- Project level
build.gradle(
在project的build.gradle中添加依赖)
allprojects {
repositories {
maven { url 'https://jitpack.io' }
}
}
- App level
build.gradle(
在app的build.gradle中添加依赖)
dependencies {
compile 'com.github.chrisbanes:PhotoView:1.2.6'
}
二、代码实现
BaseActivity是我自己定义的基类,可以换成自己的或者继承系统的都可以。
init方法是在BaseActivity中实现的抽象方法,基本等同于onCreate()方法。
/**
* Created by Administrator on 2018/9/3.
* 展示图片
*/
public class ShowImgActivity extends BaseActivity {
@Override
protected void init() {
setContentView(R.layout.activity_show_img);
String picPath = getIntent().getStringExtra("picPath");
initElement(picPath);
}
/**
* 初始化控件
*
* @param picPath 图片地址
*/
private void initElement(String picPath) {
PhotoView photoView = (PhotoView) findViewById(R.id.photo);
setElement(photoView, picPath);
}
/**
* 配置控件
*
* @param picPath 图片地址
*/
private void setElement(PhotoView photoView, String picPath) {
if (!TextUtils.isEmpty(picPath)) {
Display display = getWindowManager().getDefaultDisplay();
Point point = new Point();
display.getSize(point);
Bitmap bitmap = decodeBitmapFromSD(picPath, point.x, point.y);
photoView.setImageBitmap(bitmap);
} else {
Toast.makeText(this, "未找到文件", Toast.LENGTH_SHORT).show();
}
}
/**
* 启动Activity
*
* @param context 上下文
* @param picPath 图片地址
*/
public static void startActivity(Context context, String picPath) {
Intent intent = new Intent();
intent.setClass(context, ShowImgActivity.class);
intent.putExtra("picPath", picPath);
context.startActivity(intent);
}
}
三、布局文件
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<uk.co.senab.photoview.PhotoView
android:id="@+id/photo"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</LinearLayout>
四、decodeBitmapFromSD方法
// 从sd卡上加载图片
@Nullable
public static Bitmap decodeBitmapFromSD(String filePath,
int reqWidth, int reqHeight) {
BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
BitmapFactory.decodeFile(filePath, options);
options.inSampleSize = calculateInSampleSize(options, reqWidth, reqHeight);
options.inJustDecodeBounds = false;
if (getFileExtName(filePath).equals("jpg")) {
FileInputStream fis = null;
try {
fis = new FileInputStream(filePath);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
return BitmapFactory.decodeStream(fis, null, options);
// if (src != null) {
// return createScaleBitmap(src, reqWidth, reqHeight);
// }
}
return null;
}
五、calculateInSampleSize 计算缩放比例
private static int calculateInSampleSize(BitmapFactory.Options options,
int reqWidth, int reqHeight) {
final int height = options.outHeight;
final int width = options.outWidth;
int inSampleSize = 1;
if (height > reqHeight || width > reqWidth) {
final int halfHeight = height / 2;
final int halfWidth = width / 2;
while ((halfHeight / inSampleSize) > reqHeight
&& (halfWidth / inSampleSize) > reqWidth) {
inSampleSize *= 2;
}
}
return inSampleSize;
}
注:访问外部存储,记得添加访问权限!