私は携帯電話からすべての画像を表示するGridViewを持っています。私は複数の画像を選択し、選択した画像をarraylistに保存することができます。選択した画像のサイズを1MBに制限します。そのためには、選択中にすべての画像のサイズを確認したい。クリックされた画像のサイズが1MB未満の場合は選択され、それ以外の場合は選択されません。それを行う方法はありますか?チェックボックスの画像のサイズを確認してください。
活動
public class CustomGalleryActivity extends AppCompatActivity implements View.OnClickListener {
private static Button selectImages;
private static GridView galleryImagesGridView;
private static ArrayList<String> galleryImageUrls;
private static GridViewAdapter imagesAdapter;
int file_size;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.customgallery_activity);
initViews();
setListeners();
fetchGalleryImages();
setUpGridView();
}
//Init all views
private void initViews() {
selectImages = (Button) findViewById(R.id.selectImagesBtn);
galleryImagesGridView = (GridView) findViewById(R.id.galleryImagesGridView);
}
//fetch all images from gallery
private void fetchGalleryImages() {
final String[] columns = {MediaStore.Images.Media.DATA, MediaStore.Images.Media._ID};//get all columns of type images
final String orderBy = MediaStore.Images.Media.DATE_TAKEN;//order data by date
Cursor imagecursor = managedQuery(
MediaStore.Images.Media.EXTERNAL_CONTENT_URI, columns, null,
null, orderBy + " DESC");//get all data in Cursor by sorting in DESC order
galleryImageUrls = new ArrayList<String>();//Init array
//Loop to cursor count
for (int i = 0; i < imagecursor.getCount(); i++) {
imagecursor.moveToPosition(i);
int dataColumnIndex = imagecursor.getColumnIndex(MediaStore.Images.Media.DATA);//get column index
galleryImageUrls.add(imagecursor.getString(dataColumnIndex));//get Image from column index
System.out.println("Array path" + galleryImageUrls.get(i));
}
}
//Set Up GridView method
private void setUpGridView() {
imagesAdapter = new GridViewAdapter(CustomGalleryActivity.this, galleryImageUrls);
galleryImagesGridView.setAdapter(imagesAdapter);
}
//Set Listeners method
private void setListeners() {
selectImages.setOnClickListener(this);
}
//Show hide select button if images are selected or deselected
public void showSelectButton() {
ArrayList<String> selectedItems = imagesAdapter.getCheckedItems();
if (selectedItems.size() > 0) {
selectImages.setText(selectedItems.size() + " - Images Selected");
selectImages.setVisibility(View.VISIBLE);
} else
selectImages.setVisibility(View.GONE);
}
@Override
public void onClick(View view) {
switch (view.getId()) {
case R.id.selectImagesBtn:
//When button is clicked then fill array with selected images
ArrayList<String> selectedItems = imagesAdapter.getCheckedItems();
//Send back result to MainActivity with selected images
Intent intent = new Intent();
intent.putExtra(UploadActivity.CustomGalleryIntentKey, selectedItems.toString());//Convert Array into string to pass data
setResult(RESULT_OK, intent);//Set result OK
finish();//finish activity
break;
}
}
}
public class GridViewAdapter extends BaseAdapter {
private Context context;
private ArrayList<String> imageUrls;
private SparseBooleanArray mSparseBooleanArray;
public GridViewAdapter(Context context, ArrayList<String> imageUrls) {
this.context = context;
this.imageUrls = imageUrls;
mSparseBooleanArray = new SparseBooleanArray();
}
//Method to return selected Images
public ArrayList<String> getCheckedItems() {
ArrayList<String> mTempArry = new ArrayList<String>();
for (int i = 0; i < imageUrls.size(); i++) {
if (mSparseBooleanArray.get(i)) {
mTempArry.add(imageUrls.get(i));
}
}
return mTempArry;
}
@Override
public int getCount() {
return imageUrls.size();
//return 10;
}
@Override
public Object getItem(int i) {
return imageUrls.get(i);
}
@Override
public long getItemId(int i) {
return i;
}
@Override
public View getView(int position, View view, ViewGroup viewGroup) {
LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
if (view == null)
view = inflater.inflate(R.layout.customgridview_item, viewGroup, false);//Inflate layout
CheckBox mCheckBox = (CheckBox) view.findViewById(R.id.selectCheckBox);
final ImageView imageView = (ImageView) view.findViewById(R.id.galleryImageView);
Picasso.with(context).load("file://" + imageUrls.get(position)).placeholder(R.drawable.placeholder).into(imageView);
mCheckBox.setTag(position);//Set Tag for CheckBox
mCheckBox.setChecked(mSparseBooleanArray.get(position));
mCheckBox.setOnCheckedChangeListener(mCheckedChangeListener);
return view;
}
CompoundButton.OnCheckedChangeListener mCheckedChangeListener = new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
System.out.println("sammy_position "+buttonView.getTag());
\t \t \t File f = new File(imageUrls.get((Integer) buttonView.getTag()));
int file_size = Integer.parseInt(String.valueOf(f.length()/(1024*1024)));
// Filtering the image size
if(file_size<1){
mSparseBooleanArray.put((Integer) buttonView.getTag(), isChecked);//Insert selected checkbox value inside boolean array
((CustomGalleryActivity) context).showSelectButton();//call custom gallery activity method
}else{
buttonView.setChecked(false);
Toast.makeText(context, "Select image of size 1MB or less", Toast.LENGTH_SHORT).show();
}
}
};
}
イメージのEXIF情報を取得できます。すべての詳細を取得してローカルに保存し、アイテムのクリックを確認してください –
私はgridviewのすべての画像のサイズを取得しています。しかし、チェックボックスで選択した画像のサイズを確認するにはどうすればいいですか? –
問題は何ですか?違いは何ですか?あなたはまずそれを説明することができます。オン・チェック・チェンジ・ハンドラでイメージ・ファイルのサイズをチェックするだけで、サイズが大きすぎる場合はすぐにチェックを外す必要があります。より良い選択肢は、そのような画像を最初に表示することではありません。または、それらを有効にしたり、別の方法でマークしたりしないでください。そうでなければ、ユーザはこの試行錯誤を嫌うでしょう。 – greenapps