Android中点击图片进行图片预览功能的实现(ImagePreview图片预览工具库)

  • 因为需求,对于轮播图进行一个点击预览的功能,看了好多的文章,都没有弄出来,还是多亏了昊昊猿博主
    点击查看原文 终于把它搞定啦。

  • 这里的话是使用ImagePreview,一个非常好用的图片预览工具库(还可以实现双击放大等功能),它不需要我们创建任何布局,只需要简单的初始化,放入数据,就可以实现图片预览(多图),话不多说,先上效果图:
    在这里插入图片描述

接下来,就去讲讲如何实现的吧

1.导入依赖包
implementation 'com.github.bumptech.glide:glide:4.9.0'  //图片加载库
implementation 'com.ycjiang:ImagePreview:2.3.5' //图片预览工具库
annotationProcessor 'com.github.bumptech.glide:compiler:4.9.0'
2.新建一个 ImagePreViewLoader 类继承于 IZoomMediaLoader,代码如下:
public class ImagePreviewLoader implements IZoomMediaLoader {

    @Override
    public void displayImage(@NonNull Fragment context, @NonNull String path, ImageView imageView, @NonNull MySimpleTarget mySimpleTarget) {
        Glide.with(context)
                .asBitmap()
                .load(path)
                .apply(new RequestOptions().fitCenter())
                .into(new SimpleTarget<Bitmap>() {
                    @Override
                    public void onResourceReady(@NonNull Bitmap resource, @Nullable Transition<? super Bitmap> transition) {
                        mySimpleTarget.onResourceReady();
                        imageView.setImageBitmap(resource);

                    }
                });
    }

    @Override
    public void displayGifImage(@NonNull Fragment context, @NonNull String path, ImageView imageView, @NonNull MySimpleTarget mySimpleTarget) {
        Glide.with(context)
                .asGif()
                .load(path)
                //可以解决gif比较几种时 ,加载过慢  //DiskCacheStrategy.NONE
                .apply(new RequestOptions().diskCacheStrategy(DiskCacheStrategy.RESOURCE).dontAnimate())
               //去掉显示动画
                .listener(new RequestListener<GifDrawable>() {
                    @Override
                    public boolean onLoadFailed(@Nullable GlideException e, Object model, Target<GifDrawable> target, boolean isFirstResource) {
                        mySimpleTarget.onResourceReady();
                        return false;
                    }
                    @Override
                    public boolean onResourceReady(GifDrawable resource, Object model, Target<GifDrawable> target, DataSource dataSource, boolean isFirstResource) {
                       mySimpleTarget.onLoadFailed(null);
                        return false;
                    }
                })
                .into(imageView);
    }

    @Override
    public void onStop(@NonNull Fragment context) {
        Glide.with(context).onStop();

    }

    @Override
    public void clearMemory(@NonNull Context c) {
        Glide.get(c).clearMemory();
    }
}
3.初始化并使用

首先,我是在onCreate里放入下面这段代码进行初始化的

 ZoomMediaLoader.getInstance().init(new ImagePreviewLoader());

然后就是使用啦,我这里是轮播图(意思就是点击轮播图的第几张进行图片预览)
在这里插入图片描述
因为轮播图我是使用ViewPager2来弄的,所以我只需在viewPager2的点击监听事件中使用就可以了,代码如下:

 goodBannerAdapter.setOnRecyclerItemClickListener(new GoodBannerAdapter.OnRecyclerItemClickListener() {
            @Override
            public void OnRecyclerItemClick(int position) {
                mimgLists = new ArrayList<>();
                for(int i=0;i<imgLists.size();i++){
                    String url = imgLists.get(i);
                    mimgLists.add(new ImageViewInfo(url));
                }
                //图片预览(关键
                GPreviewBuilder.from(GoodDetail.this)
                        .setData(mimgLists)  //数据
                        .setCurrentIndex(position)  //图片下标
                        .setSingleFling(true)  //是否在黑屏区域点击返回
                        .setDrag(false)  //是否禁用图片拖拽返回
                        .setType(GPreviewBuilder.IndicatorType.Number)  //指示器类型
                        .start();  //启动
                banner_vp.setCurrentItem(position);
             }
        });

这里就可以实现预览效果啦。
但是,看到这里,可能就会有人疑问,数据从哪来,还有那个 imgLists, mimgLists又是什么,接下来就给大家详细说下:

 private ArrayList<String> imgLists;  //后台获取到的图片列表
 private List<ImageViewInfo> mimgLists;  //预览的图片列表
//mimgLists的数据是通过遍历imgLists,然后add进来的
 for(int i=0;i<imgLists.size();i++){
        String url = imgLists.get(i);
        mimgLists.add(new ImageViewInfo(url));
  }

因为 GPreviewBuilder 的setData( List<T imgList )里面放的数据类型是T继承于 IThumbViewInfo,而我从后台获取到的数据是ArrayList <String imgList的数据类型是String,所以这里我就去定义一个ImageViewInfo类继承于 IThumbViewInfo,代码如下:

public class ImageViewInfo implements IThumbViewInfo {
    //图片地址
    private String url;
    // 记录坐标
    private Rect mBounds;
    private String user = "用户字段";
    private String videoUrl;

    public ImageViewInfo(String url){
        this.url = url;
    }


    public void setUrl(String url) {
        this.url = url;
    }

    public void setUser(String user) {
        this.user = user;
    }

    public void setmBounds(Rect mBounds) {
        this.mBounds = mBounds;
    }

    public void setVideoUrl(String videoUrl) {
        this.videoUrl = videoUrl;
    }


    @Override
    public String getUrl() {
        return url;
    }

    @Override
    public Rect getBounds() {
        return mBounds;
    }

    @Nullable
    @Override
    public String getVideoUrl() {
        return videoUrl;
    }

    public String getUser() {
        return user;
    }

    @Override
    public int describeContents() {
        return 0;
    }

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeString(this.url);
    }

    protected ImageViewInfo(Parcel in){
        this.url = in.readString();
    }

    public static Creator<ImageViewInfo> CREATOR = new Creator<ImageViewInfo>() {
        @Override
        public ImageViewInfo createFromParcel(Parcel source) {
            return new ImageViewInfo(source);
        }

        @Override
        public ImageViewInfo[] newArray(int size) {
            return new ImageViewInfo[size];
        }
    };
  • 3
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
实现拍照并裁剪图片功能需要以下步骤: 1. 添加权限 在AndroidManifest.xml文件添加以下权限: ```xml <uses-permission android:name="android.permission.CAMERA"/> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> ``` 2. 创建布局文件 创建一个布局文件camera_preview.xml,并添加一个SurfaceView和一个Button,用于显示和拍照。 ```xml <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/camera_preview" android:layout_width="match_parent" android:layout_height="match_parent"> <SurfaceView android:id="@+id/surface_view" android:layout_width="match_parent" android:layout_height="match_parent"/> <Button android:id="@+id/button_capture" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="拍照" android:layout_alignParentBottom="true" android:layout_centerHorizontal="true"/> </RelativeLayout> ``` 3. 实现拍照功能 在Activity,获取Camera实例,并在SurfaceView上显示预览图像。当用户点击拍照按钮时,调用Camera.takePicture()方法拍照。拍照成功后,保存照片并显示裁剪界面。 ```java public class CameraActivity extends Activity implements SurfaceHolder.Callback { private Camera mCamera; private SurfaceView mSurfaceView; private SurfaceHolder mSurfaceHolder; private Button mButtonCapture; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.camera_preview); // 获取SurfaceView和Button实例 mSurfaceView = findViewById(R.id.surface_view); mButtonCapture = findViewById(R.id.button_capture); // 监听Button点击事件 mButtonCapture.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // 拍照 mCamera.takePicture(null, null, mPictureCallback); } }); // 获取SurfaceHolder实例,并添加回调监听 mSurfaceHolder = mSurfaceView.getHolder(); mSurfaceHolder.addCallback(this); } @Override public void surfaceCreated(SurfaceHolder holder) { // 打开摄像头并设置预览 mCamera = Camera.open(); try { mCamera.setPreviewDisplay(holder); mCamera.startPreview(); } catch (IOException e) { Log.d("CameraTest", "Error setting camera preview: " + e.getMessage()); } } @Override public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { // 在SurfaceView上显示预览图像 if (mSurfaceHolder.getSurface() == null) { return; } try { mCamera.stopPreview(); } catch (Exception e) { Log.d("CameraTest", "Error stopping camera preview: " + e.getMessage()); } try { mCamera.setPreviewDisplay(mSurfaceHolder); mCamera.startPreview(); } catch (Exception e) { Log.d("CameraTest", "Error starting camera preview: " + e.getMessage()); } } @Override public void surfaceDestroyed(SurfaceHolder holder) { // 释放摄像头资源 mCamera.stopPreview(); mCamera.release(); mCamera = null; } private Camera.PictureCallback mPictureCallback = new Camera.PictureCallback() { @Override public void onPictureTaken(byte[] data, Camera camera) { // 保存照片 File pictureFile = getOutputMediaFile(); if (pictureFile == null) { Log.d("CameraTest", "Error creating media file, check storage permissions"); return; } try { FileOutputStream fos = new FileOutputStream(pictureFile); fos.write(data); fos.close(); } catch (FileNotFoundException e) { Log.d("CameraTest", "File not found: " + e.getMessage()); } catch (IOException e) { Log.d("CameraTest", "Error accessing file: " + e.getMessage()); } // 显示裁剪界面 Intent intent = new Intent(CameraActivity.this, CropActivity.class); intent.putExtra("image_path", pictureFile.getPath()); startActivity(intent); } }; private File getOutputMediaFile() { // 创建目录 File mediaStorageDir = new File(Environment.getExternalStoragePublicDirectory( Environment.DIRECTORY_PICTURES), "MyCameraApp"); if (!mediaStorageDir.exists()) { if (!mediaStorageDir.mkdirs()) { Log.d("CameraTest", "failed to create directory"); return null; } } // 创建文件 String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date()); File mediaFile = new File(mediaStorageDir.getPath() + File.separator + "IMG_" + timeStamp + ".jpg"); return mediaFile; } } ``` 4. 实现裁剪功能 创建一个布局文件crop.xml,添加一个ImageView和一个Button,用于显示图片和保存裁剪后的图片。 ```xml <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/crop_layout" android:layout_width="match_parent" android:layout_height="match_parent"> <ImageView android:id="@+id/image_view" android:layout_width="match_parent" android:layout_height="match_parent" android:scaleType="fitCenter"/> <Button android:id="@+id/button_save" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="保存" android:layout_alignParentBottom="true" android:layout_centerHorizontal="true"/> </RelativeLayout> ``` 在CropActivity,获取传递过来的图片路径,并将图片显示在ImageView上。当用户点击保存按钮时,调用Bitmap.createBitmap()方法裁剪图片,并保存到相册。 ```java public class CropActivity extends Activity { private ImageView mImageView; private Button mButtonSave; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.crop); // 获取ImageView和Button实例 mImageView = findViewById(R.id.image_view); mButtonSave = findViewById(R.id.button_save); // 获取传递过来的图片路径 Intent intent = getIntent(); String imagePath = intent.getStringExtra("image_path"); // 将图片显示在ImageView上 Bitmap bitmap = BitmapFactory.decodeFile(imagePath); mImageView.setImageBitmap(bitmap); // 监听Button点击事件 mButtonSave.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // 裁剪并保存图片 Bitmap croppedBitmap = getCroppedBitmap(bitmap); saveBitmapToGallery(croppedBitmap); Toast.makeText(getApplicationContext(), "保存成功", Toast.LENGTH_SHORT).show(); finish(); } }); } private Bitmap getCroppedBitmap(Bitmap bitmap) { // 获取ImageView的尺寸 int viewWidth = mImageView.getWidth(); int viewHeight = mImageView.getHeight(); // 获取图片的尺寸 int imageWidth = bitmap.getWidth(); int imageHeight = bitmap.getHeight(); // 计算缩放比例 float scale = Math.min((float) viewWidth / imageWidth, (float) viewHeight / imageHeight); // 计算裁剪区域 int cropWidth = (int) (viewWidth / scale); int cropHeight = (int) (viewHeight / scale); int x = (imageWidth - cropWidth) / 2; int y = (imageHeight - cropHeight) / 2; // 裁剪图片 Bitmap croppedBitmap = Bitmap.createBitmap(bitmap, x, y, cropWidth, cropHeight); return croppedBitmap; } private void saveBitmapToGallery(Bitmap bitmap) { // 创建目录 File mediaStorageDir = new File(Environment.getExternalStoragePublicDirectory( Environment.DIRECTORY_PICTURES), "MyCameraApp"); if (!mediaStorageDir.exists()) { if (!mediaStorageDir.mkdirs()) { Log.d("CameraTest", "failed to create directory"); return; } } // 保存图片 String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date()); String imagePath = mediaStorageDir.getPath() + File.separator + "IMG_" + timeStamp + ".jpg"; File imageFile = new File(imagePath); try { FileOutputStream fos = new FileOutputStream(imageFile); bitmap.compress(Bitmap.CompressFormat.JPEG, 100, fos); fos.flush(); fos.close(); } catch (IOException e) { Log.d("CameraTest", "Error accessing file: " + e.getMessage()); } // 通知相册更新 MediaScannerConnection.scanFile(this, new String[]{imagePath}, null, null); } } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值