Android仿微信选择图片

news2024/11/18 15:36:17

效果展示

首先先添加用到的权限

  <uses-permission android:name="android.permission.INTERNET" />

    <!--获取手机存储卡权限-->
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

6.0之后动态获取权限

 //6.0之后要动态获取权限,重要!!!
    protected void judgePermission() {

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            // 检查该权限是否已经获取
            // 权限是否已经 授权 GRANTED---授权  DINIED---拒绝

            // sd卡权限
            String[] SdCardPermission = {Manifest.permission.WRITE_EXTERNAL_STORAGE};
            if (ContextCompat.checkSelfPermission(this, SdCardPermission[0]) != PackageManager.PERMISSION_GRANTED) {
                // 如果没有授予该权限,就去提示用户请求
                ActivityCompat.requestPermissions(this, SdCardPermission, 100);
            }

            //手机状态权限
            String[] readPhoneStatePermission = {Manifest.permission.READ_PHONE_STATE};
            if (ContextCompat.checkSelfPermission(this, readPhoneStatePermission[0]) != PackageManager.PERMISSION_GRANTED) {
                // 如果没有授予该权限,就去提示用户请求
                ActivityCompat.requestPermissions(this, readPhoneStatePermission, 200);
            }

            //定位权限
            String[] locationPermission = {Manifest.permission.ACCESS_FINE_LOCATION};
            if (ContextCompat.checkSelfPermission(this, locationPermission[0]) != PackageManager.PERMISSION_GRANTED) {
                // 如果没有授予该权限,就去提示用户请求
                ActivityCompat.requestPermissions(this, locationPermission, 300);
            }

            String[] ACCESS_COARSE_LOCATION = {Manifest.permission.ACCESS_COARSE_LOCATION};
            if (ContextCompat.checkSelfPermission(this, ACCESS_COARSE_LOCATION[0]) != PackageManager.PERMISSION_GRANTED) {
                // 如果没有授予该权限,就去提示用户请求
                ActivityCompat.requestPermissions(this, ACCESS_COARSE_LOCATION, 400);
            }


            String[] READ_EXTERNAL_STORAGE = {Manifest.permission.READ_EXTERNAL_STORAGE};
            if (ContextCompat.checkSelfPermission(this, READ_EXTERNAL_STORAGE[0]) != PackageManager.PERMISSION_GRANTED) {
                // 如果没有授予该权限,就去提示用户请求
                ActivityCompat.requestPermissions(this, READ_EXTERNAL_STORAGE, 500);
            }

            String[] WRITE_EXTERNAL_STORAGE = {Manifest.permission.WRITE_EXTERNAL_STORAGE};
            if (ContextCompat.checkSelfPermission(this, WRITE_EXTERNAL_STORAGE[0]) != PackageManager.PERMISSION_GRANTED) {
                // 如果没有授予该权限,就去提示用户请求
                ActivityCompat.requestPermissions(this, WRITE_EXTERNAL_STORAGE, 600);
            }

        }
  
    }

加载图片和查看图片分别用到 glide和 BigImageViewer

添加依赖

 implementation 'com.github.bumptech.glide:glide:4.9.0'
    annotationProcessor 'com.github.bumptech.glide:compiler:4.9.0'

    implementation 'com.github.piasy:BigImageViewer:1.5.7'

在settings.gradle添加 maven { url 'https://www.jitpack.io' }

dependencyResolutionManagement {
    repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
    repositories {
        google()
        mavenCentral()
        maven { url 'https://www.jitpack.io' }
    }
}

实现代码

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<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:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".MainActivity">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="#000"
        android:orientation="horizontal">

        <ImageView
            android:id="@+id/iv_back"
            android:clickable="true"
            android:src="@drawable/back_round"
            android:layout_width="45dp"
            android:layout_height="45dp" />

        <TextView
            android:textColor="#fff"
            android:gravity="center"
            android:text="@string/choose_image"
            android:layout_width="0dp"
            android:layout_weight="1"
            android:layout_height="match_parent" />


        <TextView
            android:id="@+id/tv_confirm"
            android:clickable="true"
            android:text="@string/complete"
            android:background="@drawable/bg_item_type"
            android:textColor="#888"
            android:gravity="center"
            android:paddingLeft="10dp"
            android:paddingRight="10dp"
            android:layout_margin="5dp"
            android:layout_width="wrap_content"
            android:layout_height="35dp" />
    </LinearLayout>

    <androidx.recyclerview.widget.RecyclerView
        android:id="@+id/r_layout"
        android:layout_gravity="center_horizontal"
        android:layout_width="wrap_content"
        android:layout_height="match_parent" />

</LinearLayout>

item.xml 显示图片

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="#999"
    android:padding="0.8dp"
    >

    <ImageView
        android:id="@+id/imageView2"
        android:padding="1dp"
        android:background="#000000"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:clickable="true"
        android:scaleType="centerCrop" />

    <LinearLayout
        android:id="@+id/ll_check"
        android:padding="10dp"
        android:clickable="true"
        android:layout_alignParentRight="true"
        android:layout_gravity="right"
        android:layout_width="40dp"
        android:layout_height="40dp"
        android:gravity="center"
        android:orientation="vertical">

        <TextView
            android:id="@+id/tv_check"
            android:src="@drawable/radio_unchecked"
            android:textColor="#fff"
            android:gravity="center"
            android:layout_width="match_parent"
            android:layout_height="match_parent" />
    </LinearLayout>


</FrameLayout>

MainActivity.java


import androidx.annotation.NonNull;
import androidx.annotation.RequiresApi;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;
import androidx.recyclerview.widget.GridLayoutManager;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;

import android.Manifest;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.database.Cursor;

import android.icu.text.SimpleDateFormat;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.provider.MediaStore;

import java.io.File;
import java.net.Socket;
import java.text.ParsePosition;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

public class MainActivity extends AppCompatActivity {
    static final int ACTION_TO_CAMERA = 1;
    static final int ACTION_TO_CUT = 2;
    static final int ACTION_TO_PREVIEW = 3;

    private RecyclerView rv;
    private MyAdapter adapter;
    private List<Photo> mPhotoList= new ArrayList<Photo>();

    @RequiresApi(api = Build.VERSION_CODES.N)
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //去掉顶部标题
        getSupportActionBar().hide();
        setContentView(R.layout.activity_main);
        rv = (RecyclerView) findViewById(R.id.r_layout);
        adapter = new MyAdapter(MainActivity.this);

        judgePermission(); //获取权限
        initData(); //获取图片

        // 向适配器set数据
        GridLayoutManager gridLayoutManager = new GridLayoutManager(getApplicationContext(), 4,LinearLayoutManager.VERTICAL,false);
        adapter.setData(mPhotoList);
        rv.setLayoutManager(gridLayoutManager);
        rv.setAdapter(adapter);

    }


    @RequiresApi(api = Build.VERSION_CODES.N)
    private void initData() {
        //读取手机中的相片
        Cursor cursor = getContentResolver().query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, null, null, null, null);

        if(mPhotoList != null){
            mPhotoList = null;
            mPhotoList= new ArrayList<Photo>();
        }
        while (cursor.moveToNext()) {
            //获取图片的路径
            String path=cursor.getString(cursor.getColumnIndex(MediaStore.Images.Media.DATA));
            if(path!=null && path.length() >0) {
                //获取图片的名称
                String name = cursor.getString(cursor.getColumnIndex(MediaStore.Images.Media.DISPLAY_NAME));
                //获取图片最后修改的日期
                File file = new File(path);
                long modifieTime = file.lastModified();
                SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
                String date = sdf.format(new Date(modifieTime));
                //获取图片的大小
                long size = cursor.getLong(cursor.getColumnIndex(MediaStore.Images.Media.SIZE));
                Photo photo = new Photo(name, date, size, path);
                mPhotoList.add(photo);
            }
        }
        mPhotoList = sortList(mPhotoList);

        System.out.println("个数:"+mPhotoList.size());

    }
    /**
     * List按照时间降序排列
     * @param L
     * @return
     */
    @RequiresApi(api = Build.VERSION_CODES.N)
    private List<Photo> sortList(List<Photo> L){
        SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
        Photo temp = new Photo();
        //冒泡排序,大的时间在数组的前列
        for(int i=0; i<L.size()-1; i++){
            for(int j=i+1; j<L.size();j++){
                String date1=L.get(i).getDate();
                String date2=L.get(j).getDate();
                Date d1=sdf.parse(date1,new ParsePosition(0));
                Date d2=sdf.parse(date2,new ParsePosition(0));
                boolean flag = d1.before(d2);
                //flag=true为降序,flag=flase为升序
                if (flag){
                    temp = L.get(i);
                    L.set(i, L.get(j));
                    L.set(j, temp);
                }
            }
        }
        return L;
    }



    //6.0之后要动态获取权限,重要!!!(和获取数据的方法写在一起,第一次获取不到数据,需要刷新或推出再进入)
    protected void judgePermission() {

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            // 检查该权限是否已经获取
            // 权限是否已经 授权 GRANTED---授权  DINIED---拒绝

            // sd卡权限
            String[] SdCardPermission = {Manifest.permission.WRITE_EXTERNAL_STORAGE};
            if (ContextCompat.checkSelfPermission(this, SdCardPermission[0]) != PackageManager.PERMISSION_GRANTED) {
                // 如果没有授予该权限,就去提示用户请求
                ActivityCompat.requestPermissions(this, SdCardPermission, 100);
            }

            //手机状态权限
            String[] readPhoneStatePermission = {Manifest.permission.READ_PHONE_STATE};
            if (ContextCompat.checkSelfPermission(this, readPhoneStatePermission[0]) != PackageManager.PERMISSION_GRANTED) {
                // 如果没有授予该权限,就去提示用户请求
                ActivityCompat.requestPermissions(this, readPhoneStatePermission, 200);
            }

            //定位权限
            String[] locationPermission = {Manifest.permission.ACCESS_FINE_LOCATION};
            if (ContextCompat.checkSelfPermission(this, locationPermission[0]) != PackageManager.PERMISSION_GRANTED) {
                // 如果没有授予该权限,就去提示用户请求
                ActivityCompat.requestPermissions(this, locationPermission, 300);
            }

            String[] ACCESS_COARSE_LOCATION = {Manifest.permission.ACCESS_COARSE_LOCATION};
            if (ContextCompat.checkSelfPermission(this, ACCESS_COARSE_LOCATION[0]) != PackageManager.PERMISSION_GRANTED) {
                // 如果没有授予该权限,就去提示用户请求
                ActivityCompat.requestPermissions(this, ACCESS_COARSE_LOCATION, 400);
            }


            String[] READ_EXTERNAL_STORAGE = {Manifest.permission.READ_EXTERNAL_STORAGE};
            if (ContextCompat.checkSelfPermission(this, READ_EXTERNAL_STORAGE[0]) != PackageManager.PERMISSION_GRANTED) {
                // 如果没有授予该权限,就去提示用户请求
                ActivityCompat.requestPermissions(this, READ_EXTERNAL_STORAGE, 500);
            }

            String[] WRITE_EXTERNAL_STORAGE = {Manifest.permission.WRITE_EXTERNAL_STORAGE};
            if (ContextCompat.checkSelfPermission(this, WRITE_EXTERNAL_STORAGE[0]) != PackageManager.PERMISSION_GRANTED) {
                // 如果没有授予该权限,就去提示用户请求
                ActivityCompat.requestPermissions(this, WRITE_EXTERNAL_STORAGE, 600);
            }

        }else{
            //doSdCardResult();
        }
        //LocationClient.reStart();
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

        /**
         * 返回后刷新数据
         */
        adapter.notifyDataSetChanged();

    }

}

实体类Photo.java


public class Photo {
    private String name;//名称
    private String date;//日期
    private long size;  //大小
    private String path;//路径
    /**
     * 构造函数
     */
    public Photo() {
    }
    public Photo(String name, String date, long size, String path) {
        this.name = name;
        this.date = date;
        this.size = size;
        this.path = path;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getDate() {
        return date;
    }

    public void setDate(String date) {
        this.date = date;
    }

    public long getSize() {
        return size;
    }

    public void setSize(long size) {
        this.size = size;
    }

    public String getPath() {
        return path;
    }

    public void setPath(String path) {
        this.path = path;
    }

    @Override
    public String toString() {
        return "Photo{" +
                "name='" + name + '\'' +
                ", date='" + date + '\'' +
                ", size=" + size +
                ", path='" + path + '\'' +
                '}';
    }
}

RecyclerView适配器 MyAdapter.java


import android.app.Activity;
import android.content.Context;
import android.content.Intent;

import android.util.DisplayMetrics;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.CheckBox;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;

import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;

import com.bumptech.glide.Glide;

import java.io.BufferedOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;

/**
 * Created by sp01 on 2017/4/28.
 */

public class MyAdapter extends RecyclerView.Adapter {
    private Activity context;
    public static List<Photo> data;
    public static List<String> isChecks;

    public MyAdapter(Activity context) {
        this.context = context;
        data = new ArrayList<>();
        isChecks = new ArrayList<>();
    }

    /**
     * 添加数据
     * @param data
     */
    public void setData(List<Photo> data) {
        this.data=data;
    }

    @Override
    public int getItemViewType(int position) {
        return 1;
    }

    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        RecyclerView.ViewHolder holder = null;

        View view = LayoutInflater.from(context).inflate(R.layout.item,parent,false);
        holder = new OneViewHolder(view);
        return holder;
    }

    @Override
    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {


        OneViewHolder oneViewHolder = (OneViewHolder) holder;

        String item = data.get(position).getPath();  //图片地址


        oneViewHolder.ll_check.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (!isChecks.contains(item)) {
                   // isChecks.clear();
                    if (isChecks.size() <99) {
                        isChecks.add(item);
                        notifyDataSetChanged();
                    }
                    // onImageChecked(mParameters.mMaxCount, checkedList.size());

                } else {
                    isChecks.remove(item);
                    notifyDataSetChanged();
                   // onImageChecked(mParameters.mMaxCount, checkedList.size());
                }

            }
        });
        oneViewHolder.imageView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {


                context.startActivityForResult(

                        new Intent(context, ImagePreviewActivity.class)
                                .putExtra("position",  position)
                                .putExtra("count", 1)
                        , MainActivity.ACTION_TO_PREVIEW
                );
            }
        });

        Glide.with(context)  //上下文
                .asBitmap()
                .centerCrop()  //图片中间部分
                .load(item) //图片地址
                .error(R.mipmap.qwe)              //图片加载出错时显示的图片
               // .override(500,500)   //设置图片宽高
                .into(oneViewHolder.imageView);   //Imageview

        if(isChecks.contains(item)){
            oneViewHolder.tv.setBackgroundResource(R.drawable.bg_green_circle);
            oneViewHolder.tv.setText((isChecks.indexOf(item)+1)+"");
            oneViewHolder.imageView.setColorFilter(R.color.black);
        }
        else {
            oneViewHolder.imageView.setColorFilter(1);
            oneViewHolder.tv.setBackgroundResource(R.drawable.radio_unchecked);
            oneViewHolder.tv.setText((isChecks.indexOf(item)+1)+"");
        }

    }

    @Override
    public int getItemCount() {
        return  data != null && data.size() > 0 ? data.size() : 0;
    }

    class OneViewHolder extends RecyclerView.ViewHolder{
        private ImageView imageView;
        private TextView tv;
        private LinearLayout ll_check;
        public OneViewHolder(View itemView) {
            super(itemView);
            imageView = (ImageView) itemView.findViewById(R.id.imageView2);
            tv = itemView.findViewById(R.id.tv_check);
            ll_check = itemView.findViewById(R.id.ll_check);
            //方法三:应用程序显示区域指定可能包含应用程序窗口的显示部分,不包括系统装饰
            DisplayMetrics displayMetrics = context.getResources().getDisplayMetrics();
            int width = displayMetrics.widthPixels;


            // 动态设置image宽和高
            ViewGroup.LayoutParams params = imageView.getLayoutParams();
            params.width = width/4;
            params.height =  width/4;
            imageView.setLayoutParams(params);
        }
    }


}

剩下的就是选中图片后的查看大图片了

activity_image_preview.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    xmlns:tools="http://schemas.android.com/tools"
    android:background="#ff000000"
    tools:context=".ImagePreviewActivity">


    <androidx.viewpager.widget.ViewPager
        android:id="@+id/vp_img"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center_vertical"
        android:orientation="horizontal">

        <Button
            android:id="@+id/btn_back"
            android:layout_width="45dp"
            android:layout_height="45dp"
            android:background="@drawable/back_round" />

        <TextView
            android:id="@+id/tv_num"
            android:background="#9999"
            android:layout_marginLeft="20dp"
            android:layout_marginRight="20dp"
            android:layout_weight="1"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:gravity="center"
            android:paddingRight="15dp"
            android:text="0/0"
            android:textColor="#888"
            android:textStyle="bold"
            android:textSize="16sp" />

        <TextView
            android:id="@+id/tv_confirm"
            android:clickable="true"
            android:background="@drawable/bg_item_type"
            android:text="@string/complete"
            android:textColor="#888"
            android:gravity="center"
            android:paddingLeft="10dp"
            android:paddingRight="10dp"
            android:layout_width="wrap_content"
            android:layout_margin="5dp"
            android:layout_height="35dp"  />
    </LinearLayout>

    <ImageView
        android:id="@+id/ll_check"
        android:padding="10dp"
        android:clickable="true"
        android:src="@drawable/radio_unchecked"
        android:layout_alignParentBottom="true"
        android:layout_margin="5dp"
        android:layout_gravity="right"
        android:layout_width="40dp"
        android:layout_height="40dp" />

</RelativeLayout>

item_preview.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:background="#000"
    android:layout_gravity="center"
    android:orientation="vertical"
    android:gravity="center"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content">



    <com.github.piasy.biv.view.BigImageView
        android:id="@+id/iv_item2"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:failureImageInitScaleType="center"
        app:optimizeDisplay="true" />


</LinearLayout>

ImagePreviewActivity.java


import android.content.Context;
import android.graphics.Color;
import android.os.Bundle;
import android.view.View;
import android.view.WindowManager;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;

import androidx.appcompat.app.AppCompatActivity;
import androidx.viewpager.widget.ViewPager;

import com.github.piasy.biv.BigImageViewer;
import com.github.piasy.biv.loader.fresco.FrescoImageLoader;


public class ImagePreviewActivity extends AppCompatActivity {

    Context mContext;
    ViewPager vpImg;
    Button btBack;
    TextView tvNum;
    TextView tvConfirm;
    ImageView ivCheck;
    View.OnClickListener onClickListener;
    PreviewAdapter previewAdapter;

    int count;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mContext = this;
        BigImageViewer.initialize(FrescoImageLoader.with(mContext));
        setContentView(R.layout.activity_image_preview);
        setNoTitle();
        findViewById();
        setAdapter();
        setNum();
    }

    private void setNum() {
        count = getIntent().getIntExtra("count", 2);
        tvNum.setText(MyAdapter.isChecks.size() + "/" + 99);
        if (MyAdapter.isChecks.size() == 0) {
            tvNum.setTextColor(Color.parseColor("#808080"));
            tvConfirm.setTextColor(Color.parseColor("#808080"));
            tvConfirm.setBackgroundResource(R.drawable.bg_item_type);
        } else {
            tvNum.setTextColor(Color.parseColor("#f0f0f0"));
            tvConfirm.setTextColor(Color.parseColor("#f0f0f0"));
            tvConfirm.setBackgroundResource(R.drawable.bg_confirm);
        }
    }

    private void setAdapter() {
        previewAdapter = new PreviewAdapter();
        vpImg.setAdapter(previewAdapter);
        vpImg.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {
            @Override
            public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {

            }

            @Override
            public void onPageSelected(int position) {
                if (MyAdapter.isChecks.contains(MyAdapter.data.get(position).getPath())) {
                    ivCheck.setImageResource(R.drawable.radio_checked);
                } else {
                    ivCheck.setImageResource(R.drawable.radio_unchecked);
                }
            }

            @Override
            public void onPageScrollStateChanged(int state) {

            }
        });
        vpImg.setCurrentItem(getIntent().getIntExtra("position", 0));

    }

    private void findViewById() {
        vpImg = findViewById(R.id.vp_img);
        btBack = findViewById(R.id.btn_back);
        tvNum = findViewById(R.id.tv_num);
        tvConfirm = findViewById(R.id.tv_confirm);
        ivCheck = findViewById(R.id.ll_check);
        onClickListener = new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (v.getId() == R.id.btn_back) {
                    finish();
                } else if (v.getId() == R.id.tv_confirm) {
                    setResult(RESULT_OK);
                    finish();
                } else if (v.getId() == R.id.ll_check) {
                    String item = MyAdapter.data.get(vpImg.getCurrentItem()).getPath();
                    if (MyAdapter.isChecks.contains(item)) {
                        MyAdapter.isChecks.remove(item);
                        ivCheck.setImageResource(R.drawable.radio_unchecked);
                    } else {

                        if (MyAdapter.isChecks.size() < 99) {
                            MyAdapter.isChecks.add(item);
                            ivCheck.setImageResource(R.drawable.radio_checked);
                        }

                    }
                    setNum();
                }
            }
        };
        btBack.setOnClickListener(onClickListener);
        tvConfirm.setOnClickListener(onClickListener);
        ivCheck.setOnClickListener(onClickListener);
    }

    private void setNoTitle() {
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);//去掉信息栏
        getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
        try {
            getSupportActionBar().hide();
        } catch (Exception e) {
        }
    }


    @Override
    protected void onDestroy() {
        super.onDestroy();
        BigImageViewer.imageLoader().cancelAll();
    }

}

pagerView适配器 PreviewAdapter.java


import android.net.Uri;

import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;

import androidx.annotation.NonNull;
import androidx.viewpager.widget.PagerAdapter;

import com.bumptech.glide.Glide;
import com.github.piasy.biv.indicator.progresspie.ProgressPieIndicator;
import com.github.piasy.biv.view.BigImageView;
import com.github.piasy.biv.view.FrescoImageViewFactory;

import java.io.File;

public class PreviewAdapter extends PagerAdapter {
    @Override
    public int getCount() {
        return MyAdapter.data.size();
    }

    @Override
    public boolean isViewFromObject(@NonNull View view, @NonNull Object object) {
        return view == object;
    }

    @Override
    public Object instantiateItem(ViewGroup container, int position) {
        String item = MyAdapter.data.get(position).getPath();
        System.out.println("图片路径:"+item);

        View itemView = LayoutInflater.from(container.getContext()).inflate(R.layout.item_preview, null);
        container.addView(itemView);
        BigImageView ivItem = (BigImageView) itemView.findViewById(R.id.iv_item2);

        // 获取手机本地图片
        ivItem.showImage(Uri.fromFile(new File(item)));

        // 获取网络图片
        // ivItem.showImage(Uri.parse(("https://img2.woyaogexing.com/2023/03/03/2b7c846abc54f1a8c10e683951ccbc8c.jpg")));
        ivItem.setImageViewFactory(new FrescoImageViewFactory());
        ivItem.setProgressIndicator(new ProgressPieIndicator());


        return itemView;

    }

    @Override
    public void destroyItem(ViewGroup container, int position, Object object) {
        container.removeView((View) object);
    }

}

以上就是所有的代码了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/388852.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

java 包装类 万字详解(通俗易懂)

前言简介和溯源拆装箱String类和基本类型的相互转化String类和包装类型的相互转化八大包装类的常用方法汇总&#xff08;含代码演示&#xff09;一、前言 : 本节内容是我们《API-常用类》专题的最后一节了。本节内容主要讲包装类&#xff0c;内容包括但不限于包装类的诞生&…

Linux磁盘占满,如何清理磁盘空间

目录解决思路&#xff1a;先查linux磁盘为什么占满了&#xff0c;是什么导致的&#xff0c;这样才好去定位目录&#xff0c;清楚空间写者的问题是测试环境磁盘占满&#xff0c;原因是测试环境tomcat的日志都会保留&#xff0c;日志空间占用太大把linux磁盘占满&#xff0c;导致…

HTML 表单

HTML 表单和输入 HTML 表单用于收集不同类型的用户输入。 在线实例 创建文本字段 (Text field) 本例演示如何在 HTML 页面创建文本域。用户可以在文本域中写入文本。 创建密码字段 本例演示如何创建 HTML 的密码域。 &#xff08;在本页底端可以找到更多实例。&#xff09; …

信息安全与数学基础-笔记-①整数的可除性

知识目录整除素数带余除法最大公因数&#xff08;欧几里德算法&#xff09;裴蜀等式最小公倍数❀标准分解式❀标准分解式求最大公因数标准分解式求最小公倍数整除 a bq 公式表达的意思&#xff1a;b整除a&#xff0c;a可被b整除 用符号表示&#xff1a;b | a 否则&#xff1a…

【SpringMVC】SpringMVC程序开发

SpringMVC程序开发 文章目录SpringMVC程序开发:one:认识SpringMVC什么是SpringMVCMVC思想:two:获取请求参数创建SpringMVC项目建立路由连接获取请求参数获取urlEncoded格式参数获取表单标签参数获取Json格式参数获取URL中的参数上传图片获取请求信息获取请求header获取cookie创…

Linux -- 信号控制进程 Kill 命令 简引

Kill 命令 &#xff1a;给进程发送信号 &#xff1a;[rootfsw ~]# kill -l # 可以列出 当前所有的信号量 比较常用的就是 &#xff1a;1) SIGHUP 重新加载配置2) SIGINT 键盘中断^C 即 Ctrl C3) SIGQUIT 键盘退出9) SIGKILL 强制终止15) SIGTERM 终止&#xff08;正…

『OPEN3D』点云表面重建

目录 1 点云法线一致性估计 2 点云的表面重建 1 Alpha shapes reconstruction 2 Ball pivoting reconstruction 3 poisson surface reconstruction 1 点云法线一致性估计 在点云处理的章节中已经介绍使用estimate_normals来生成点云的发现信息&#xff0c;但该方法通过拟合…

业务流程测试

用例设计主要问题主要问题存在于&#xff1a;1、测试点分析&#xff1a;逻辑性不强对于整个页面功能划分不清晰&#xff1b;不同测试点归类不清晰&#xff1b;不能形成相对固定的套路&#xff0c;书写耗费大量时间...2、测试用例&#xff1a;关于&#xff0c;要细致到什么程度&…

一个供参考的计算机的学习路线

本文是介绍如何成为一个Geek&#xff0c;一个真正的计算机高手。 适合有成为IT领域技术大牛的人参考。 写给大一新生和所有向深耕IT领域的人&#xff0c;避免走一些弯路。 仅代表个人想法&#xff0c;供批判性参考。 第一门入门的必备功课-语法与算法 什么是计算机&#xff1f…

力扣sql简单篇练习(二十二)

力扣sql简单篇练习(二十二) 1 上月播放的儿童适宜电影 1.1 题目内容 1.1.1 基本题目信息 1.1.2 示例输入输出 a 示例输入 b 示例输出 1.2 示例sql语句 # Write your MySQL query statement belowSELECT titleFROM ContentWHERE kids_contentY AND content_typeMoviesAND c…

MYSQL性能分析,Explain

文章目录一、MYSQL常见瓶颈二、ExplainExplain是什么一、MYSQL常见瓶颈 CPU&#xff1a; CPU饱和IO&#xff1a;磁盘IO速度过慢。服务器的硬件性能瓶颈。 二、Explain Explain是什么 使用explain关键字可以模拟优化器执行sql查询语句&#xff0c;从而知道mysql如何处理你的…

Python 随机漫步

目录 1. 创建 RandomWalk 类 2. 选择方向 3. 绘制随机漫步图 4. 总结 本篇博客将使用 Python 来生成随机漫步数据&#xff0c;在使用 Matplotlib 以引人注目的方式将这些数据呈现出来。 随机漫步 是这样行走得到的路径&#xff1a;每次行走都是完全随机的、没有明确…

跨域问题以及Ajax和Axios的区别

文章目录1. 同源策略2. 同源策略案例3. 什么是跨域4. 跨域解决方法4.1 Ajax的jsonp4.2 CORS方式4.3 Nginx 反向代理5. Axios 和 Ajax 的区别6. Axios 和 Ajax 的区别及优缺点6.1 Ajax&#xff1a;6.1.1 什么是Ajax6.1.2 Ajax的原理6.1.3 核心对象6.1.4 Ajax优缺点6.1.4.1 优点&…

大白话+画图 从源码角度一步步搞懂ArrayList和LinkedList的使用

1.说说ArrayList 1.基本原理 ArrayList&#xff0c;原理就是底层基于数组来实现。 01.基本原理&#xff1a; 数组的长度是固定的&#xff0c;java里面数组都是定长数组&#xff0c;比如数组大小设置为100&#xff0c;此时你不停的往ArrayList里面塞入这个数据&#xff0c;此…

Warshall算法求传递闭包及Python编程的实现

弗洛伊德算法-Floyd(Floyd-Warshall)-求多源最短路径&#xff0c;求传递闭包 Floyd算法又称为插点法&#xff0c;是一种利用动态规划的思想寻找给定的加权图中多源点之间最短路径的算法&#xff0c; 与Dijkstra算法类似。该算法名称以创始人之一、1978年图灵奖获得者、斯坦福大…

minikube搭建Kubernetes环境

前言 Kubernetes 一般都运行在大规模的计算集群上&#xff0c;管理很严格&#xff0c;Kubernetes 充分考虑到了这方面的需求&#xff0c;提供了一些快速搭建 Kubernetes 环境的工具。 minikube 它是一个“迷你”版本的 Kubernetes&#xff0c;自从 2016 年发布以来一直在积极地…

Lesson 8.1 决策树的核心思想与建模流程

文章目录一、借助逻辑回归构建决策树1. 决策树实例2. 决策树知识补充2.1 决策树简单构建2.2 决策树的分类过程2.3 决策树模型本质2.4 决策树的树生长过程2.5 树模型的基本结构二、决策树的分类与流派1. ID3(Iterative Dichotomiser 3) 、C4.5、C5.0 决策树2. CART 决策树3. CHA…

minio安装配置和使用(一)

minio官网https://www.minio.org.cn 从官网获得安装文件。官网提供了Binary、RPM、DEB三种方式安装minio。 Binary方式我在我的测试环境中没有测试通过&#xff0c;按官网方式下载执行会报错如下&#xff1a; 查了下这个错误提示&#xff0c;似乎跟内存有关。 改用RPM方式安…

HCIP第一个实验

实验要求与实验拓扑子网划分分析将骨干链路看成一个整体&#xff0c;路由器后的2个环回地址先看成一个&#xff0c;最后再进行拆分。计算得出&#xff0c;一共需要划分为6个子网段&#xff0c;取三位。再将每一条网段&#xff0c;按照题目要求进行划分最后完成子网划分。子网划…

进行嵌入式C语言编程调试的通用办法

总结了一下调试我们嵌入式C程序的一些基本的办法和思想&#xff0c;供大家学习参考&#xff1a; 打印日志&#xff1a;在代码中添加打印语句&#xff0c;输出变量值、函数调用等信息&#xff0c;以便在程序运行时观察程序执行情况。 断点调试&#xff1a;在代码中添加断点&…