Android开发:实现图片缩放之PhotoView的使用

项目中需要显示图片,并对图片进行缩放,于是选择了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;
}

注:访问外部存储,记得添加访问权限!

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值