Autore Topic: Gallerie lente - gridview/viewpager  (Letto 791 volte)

Offline kikko088

  • Nuovo arrivato
  • *
  • Post: 21
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Nexus s
  • Sistema operativo:
    OSx e Win
Gallerie lente - gridview/viewpager
« il: 22 Luglio 2014, 02:08:31 CEST »
0
Ciao a tutti sto cercando di creare une semplice galleria che prende le immagini dalla sdcard ma non sono ancora riuscir ad avere qualcosa di fluido, potreste darmi un due dritte su come migliorare il tutto?

questa è ala gridview:

Codice (Java): [Seleziona]
public class GalleryFragment extends Fragment {

       
        int width;
       
        View view;
        GridView gridview;
       
        private ImageAdapter imageAdapter;
   
        String outputString;

    @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

                view = inflater.inflate(R.layout.gallery_layout, container, false);
                view.setBackgroundColor(getResources().getColor(R.color.white));

               
                 
               
                return view;
        }

        @Override
        public void onCreate(Bundle savedInstanceState) {

                super.onCreate(savedInstanceState);

               
                setHasOptionsMenu(true);
        }

        @Override
        public void onStart (){

                super.onStart();
                int col = 5;
               
        Display display = getActivity().getWindowManager().getDefaultDisplay();
        Point size = new Point();
        display.getSize(size);
        width = size.x / col;
       
       
                imageAdapter = new ImageAdapter(getActivity());
               
        gridview = (GridView) view.findViewById(R.id.sdcard);
        gridview.setNumColumns(col);
        gridview.setAdapter(imageAdapter);
        gridview.setChoiceMode(GridView.CHOICE_MODE_MULTIPLE_MODAL);
                gridview.setMultiChoiceModeListener(new MultiChoiceModeListener());        
        gridview.setOnItemClickListener(new OnItemClickListener() {
               
                        public void onItemClick(AdapterView<?> parent, View v, int position, long id) {
                       
                                Bundle data = new Bundle();
                        data.putInt("position",position);
                        data.putString("path", outputString);  
                       
                                FragmentManager fragmentManager = getActivity().getSupportFragmentManager();
                        Fragment fragment = new ImageDetail();
                        fragment.setArguments(data);
                        fragmentManager.beginTransaction().add(R.id.container, fragment, "gallery_detail").addToBackStack("gallery").commitAllowingStateLoss();
                        fragmentManager.executePendingTransactions();
               
                }
                       
            });


        loadImages();
       
     }

       

        private void loadImages() {
       
                new LoadImagesFromSDCard().execute();

    }



    private void addImage(LoadedImage... value) {
        for (LoadedImage image : value) {
            imageAdapter.addPhoto(image);
            imageAdapter.notifyDataSetChanged();
        }
    }
   
   
    class LoadImagesFromSDCard extends AsyncTask<Object, LoadedImage, Object> {
       
        /**
         * Load images from SD Card in the background, and display each image on the screen.
         *  
         * @see android.os.AsyncTask#doInBackground(Params[])
         */

        @Override
        protected Object doInBackground(Object... params) {
                   
           
                Bitmap bitmap = null;
                Bitmap newBitmap = null;
                Uri uri = null;
           
                ArrayList<String> array = new ArrayList<String>();
                outputString = Environment.getExternalStorageDirectory().getPath() + "/test/";
           
            File folder_images = new File(outputString);
             
             
            boolean success_img = true;

            if (!folder_images.exists()) {
                success_img = folder_images.mkdirs();
            }
             
            int r = 9/16;
           
            File[] files = folder_images.listFiles();
            for (File file : files){
                array.add(file.getAbsolutePath());
               
                String path = file.getAbsolutePath().toString();
               
                Log.d("Width",": " + width);
               
                float w = (float) (width * 1/0.56);
               
                bitmap = BitmapFactory.decodeFile(path);
                                if (bitmap != null) {
                                    newBitmap = Bitmap.createScaledBitmap(bitmap, 2*width , width, false);
                                    bitmap.recycle();
                                    if (newBitmap != null) {
                                        publishProgress(new LoadedImage(newBitmap,path));
                                    }
                                }
               
            }

             
             
             
             

            return null;
           
           
        }
        /**
         * Add a new LoadedImage in the images grid.
         *
         * @param value The image.
         */

        @Override
        public void onProgressUpdate(LoadedImage... value) {
            addImage(value);
        }
        /**
         * Set the visibility of the progress bar to false.
         *
         * @see android.os.AsyncTask#onPostExecute(java.lang.Object)
         */

        @Override
        protected void onPostExecute(Object result) {
           
        }
    }


    /**
     * Adapter for our image files.
     *
     * @author Mihai Fonoage
     *
     */

    class ImageAdapter extends BaseAdapter {

        private Context mContext;
        private ArrayList<LoadedImage> photos = new ArrayList<LoadedImage>();
        private SparseBooleanArray mSelectedItemsIds = new SparseBooleanArray();
               
       
        public ImageAdapter(Context context) {
            mContext = context;
        }

        public void addPhoto(LoadedImage photo) {
            photos.add(photo);
        }

        public int getCount() {
            return photos.size();
        }

        public Object getItem(int position) {
               
                Log.d("get: ", photos.get(position).toString());
               
            return photos.get(position);
        }

        public long getItemId(int position) {
            return position;
        }

        public View getView(int position, View convertView, ViewGroup parent) {
               
                CheckableLayout l;
            ImageView i;
 
            if (convertView == null) {
                i = new ImageView(getActivity());
                i.setLayoutParams(new FrameLayout.LayoutParams(width-10, width-10,Gravity.CENTER));
               
                l = new CheckableLayout(getActivity());
                l.setLayoutParams(new GridView.LayoutParams(width,width));
                l.addView(i);
            } else {
                l = (CheckableLayout) convertView;
                i = (ImageView) l.getChildAt(0);
            }
                   
            i.setImageBitmap(photos.get(position).getBitmap());
            i.setScaleType(ImageView.ScaleType.CENTER_CROP);
            i.setPadding(8, 8, 8, 8);
            i.setTag("");
                   
                return l;

        }
       
       
       
        public void remove(LoadedImage object) {
                        // TODO Auto-generated method stub
                       
                       
                        photos.remove(object);
                               
                        imageAdapter.notifyDataSetChanged();

                       
                }

            public void toggleSelection(int position) {
               
                selectView(position, !mSelectedItemsIds.get(position));
            }
         
            public void removeSelection() {
               
                mSelectedItemsIds = new SparseBooleanArray();
               
               
            }
         
            public void selectView(int position, boolean value) {
               
                if(mSelectedItemsIds == null)
                        mSelectedItemsIds = new SparseBooleanArray();
               
                if (value)
                    mSelectedItemsIds.put(position, value);
                else
                    mSelectedItemsIds.delete(position);
               
                Log.d("Key" + position , "Value" + value);
               
               
                notifyDataSetChanged();
            }
           
            public int getSelectedCount() {
               
                return mSelectedItemsIds.size();
            }
                   
            public SparseBooleanArray getSelectedIds() {
               
               
                return mSelectedItemsIds;
            }

        public void resetSelectedItem(){
                mSelectedItemsIds = new SparseBooleanArray();
        }
       
       
    }

    /**
     * A LoadedImage contains the Bitmap loaded for the image.
     */

    private static class LoadedImage {
        Bitmap mBitmap;
        String path;
       

       
        LoadedImage(Bitmap bitmap,String s) {
            mBitmap = bitmap;
            this.path = s;
        }

        public Bitmap getBitmap() {
            return mBitmap;
        }
       
        public String getPath(){
                return this.path;
        }
    }
   
   
   
        public class CheckableLayout extends FrameLayout implements Checkable {
               
                private boolean mChecked;

                public CheckableLayout(Context context) {
                        super(context);
                }

                public void setChecked(boolean checked) {
                       
                        mChecked = checked;
       
                        if(checked == true){
                                setBackgroundColor(getResources().getColor(R.color.tutorial_text));    
                        }
                        else {
                                setBackgroundColor(android.graphics.Color.WHITE);
                        }
       
    }

                public boolean isChecked() {
        return mChecked;
    }

                public void toggle() {
        setChecked(!mChecked);
    }

        }

   
   
    public class MultiChoiceModeListener implements GridView.MultiChoiceModeListener {
               
                @Override
                public boolean onCreateActionMode(android.view.ActionMode mode, Menu menu) {
                        // TODO Auto-generated method stub
                        mode.setTitle("Select Items");
                        mode.setSubtitle("One item selected");
                       
                        return true;
                }

                @Override
                public boolean onPrepareActionMode(android.view.ActionMode mode,Menu menu) {
                        // TODO Auto-generated method stub
                       
                        mode.getMenuInflater().inflate(R.menu.gallery, menu);
                   
                        return true;
                }
               
                @Override
                public boolean onActionItemClicked(android.view.ActionMode mode,MenuItem item) {
                       
                    switch (item.getItemId()) {
                   
                        case R.id.remove:{
                               
                                SparseBooleanArray selected = imageAdapter.getSelectedIds();
                               
                               
                               
                    for (int i = selected.size()-1; i >= 0; i--) {

                        LoadedImage selecteditem = (LoadedImage) imageAdapter.getItem(selected.keyAt(i));
                               
                        Log.d("Key",": " + selected.keyAt(i));
                       
                                try{
                                        imageAdapter.remove(selecteditem);
                                }
                                catch (Exception e){
                                        Log.d("Errore",e.getMessage());
                        }
                       

                                File file = new File(selecteditem.path);
                                boolean deleted = file.delete();
                               
                                imageAdapter.notifyDataSetChanged();
                    }
                   
                   
                    // Close CAB
                    mode.finish();
                   
                    imageAdapter.resetSelectedItem();
                   
                        }

                    return true;
                default:
                    return false;
                    }
                       
                }

                @Override
                public void onDestroyActionMode(android.view.ActionMode mode) {
                        // TODO Auto-generated method stub
                       
                       
                }

                @Override
                public void onItemCheckedStateChanged(android.view.ActionMode mode,int position, long id, boolean checked) {
                       
                        // TODO Auto-generated method stub
                       
                        int selectCount = gridview.getCheckedItemCount();
                        switch (selectCount) {
                        case 1:
                                mode.setSubtitle("One item selected");
                        break;
                        default:
                                mode.setSubtitle("" + selectCount + " items selected");
                        break;
                        }
                       
                        imageAdapter.toggleSelection(position);
                }
        }

        @Override
        public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
           
            super.onCreateOptionsMenu(menu,inflater);
           
            menu.clear();
           
        }
}


e questo è i viewpager dettaglio:

Codice (Java): [Seleziona]
        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

                view = inflater.inflate(R.layout.detail_image, container, false);
                view.setBackgroundColor(android.graphics.Color.WHITE);
               
                return view;
        }
   
   
        @Override
        public void onCreate(Bundle savedInstanceState) {
               
                super.onCreate(savedInstanceState);
                       
                getActivity().invalidateOptionsMenu();
               
                setHasOptionsMenu(true);
    }
       
        @Override
        public void onStart (){

                super.onStart();
               
        Bundle arguments = getArguments();
       
                position = arguments.getInt("position");
                path = arguments.getString("path");
               
                loadedImagesList = new ArrayList<String>();
               
        String outputString = Environment.getExternalStorageDirectory().getPath() + "/test/";
       
        File folder_images = new File(path);
         
        boolean success_img = true;
        if (!folder_images.exists()) {
            success_img = folder_images.mkdirs();
        }
         
        pageradapter = new ImagePagerAdapter();
       
        File[] files = folder_images.listFiles();
        for (File file : files){
                pageradapter.addPhoto(file.getAbsolutePath());
        }
       
        //zooming = false;
       
                viewpager = (ViewPager) view.findViewById(R.id.pager);
                viewpager.setAdapter(pageradapter);
                viewpager.setCurrentItem(position);
                viewpager.setOnPageChangeListener(this);
               
                viewpager.setOnTouchListener(new OnTouchListener()
            {          
                @Override
                public boolean onTouch(View v, MotionEvent event)
                {
                       
                        if(mode == NONE)
                                return true;
                        else
                                return false;
                }
            });
               
               
        }
       
       
        public class ImagePagerAdapter extends PagerAdapter {
                 
         
            public ImagePagerAdapter() {
               
            }
         
        public void addPhoto(String photo) {
                loadedImagesList.add(photo);
        }

       
            @Override
            public Object instantiateItem(ViewGroup container, int position) {
               
               
                TouchImageView imageView = new TouchImageView(getActivity());
               
                BitmapFactory.Options options = new BitmapFactory.Options();
                options.inPreferredConfig = Bitmap.Config.ARGB_8888;
               
                Bitmap bitmap = BitmapFactory.decodeFile(loadedImagesList.get(position), options);
                imageView.setImageBitmap(bitmap);
               
                f = loadedImagesList.get(position);
               
                container.addView(imageView);
               
               
             
                return imageView;
            }
         
         
            @Override
            public void destroyItem(ViewGroup container, int position, Object object) {
               
                viewpager.removeView((View) object);
            }
         
            @Override
            public int getCount() {
                return loadedImagesList.size();
            }
         
            @Override
            public boolean isViewFromObject(View view, Object o) {
                return view == o;
            }
        }

       
        @Override
        public void onPageScrollStateChanged(int arg0) {
                // TODO Auto-generated method stub
               
        }

        @Override
        public void onPageScrolled(int arg0, float arg1, int arg2) {
                // TODO Auto-generated method stub
               
        }

        @Override
        public void onPageSelected(int arg0) {
                // TODO Auto-generated method stub
               
                /*
                BitmapFactory.Options options = new BitmapFactory.Options();
        options.inPreferredConfig = Bitmap.Config.ARGB_8888;
        Bitmap bitmap = BitmapFactory.decodeFile(loadedImagesList.get(position+1), options);
        Bitmap bm = BitmapFactory.decodeFile(loadedImagesList.get(position), options);
       
                ImageView thumb_1 = (ImageView) view.findViewById(R.id.thumb_1);
            ImageView thumb_2 = (ImageView) view.findViewById(R.id.thumb_2);
           
            thumb_1.setImageBitmap(bitmap);    
            thumb_2.setImageBitmap(bm);
         
                 */

           
        }

questa va anche abbastanza bene, ma appena ci sono immagini più grandi inizia a scattare, se poi inserisco le thumb allora si blocca...sapreste aiutarmi?