android - using Gallery, how to highlight a selection and not move the row after touching image? -


there 2 things want achieve gallery view:

1) when user makes selection within gallery view not want images move (i.e. not want selected image move center)

2) when user makes selection within gallery view want selected image highlighted orange on action_down, , highlight removed on action_up - on buttons.

how done ?

solved myself ...

the following features included in sample code

  1. apparently-endless horizontal scrolling
  2. selection detection without using godawful gallery.setonitemselectedlistener().
  3. highlighting selection (although needs more work - namely storing selection because gallery lose highlighting after it's scrolled off-screen)

public class activitymine extends activity implements ontouchlistener {     //ui references     private gallery mgallery;      //member variables     private float fx, fy;     private imagebuffer mimagebuffer;//just array of images       @override     protected void oncreate(bundle savedinstancestate)     {         super.oncreate(savedinstancestate);         setcontentview(r.layout.filter);          //get references ui components         mgallery = (gallery) findviewbyid(r.id.filter_gallery);          //make widgets touch sensitive         mgallery.setontouchlistener(this);          //connect gallery adapter         mgallery.setadapter(new galleryadapter(this, mimagebuffer));          //auto-select first image (position 1073741820)         final int itemp = (int)( integer.max_value / 2 ) - ( ( integer.max_value / 2 ) % mimagebuffer.getcount() );         mgallery.setselection(itemp);     }       @override     protected void ondestroy()     {         super.ondestroy();     }       public boolean ontouch(view v, motionevent event)     {         final int actionperformed = event.getaction();         final int widgetid = v.getid();          if (actionperformed == motionevent.action_down)         {             if (widgetid == r.id.filter_gallery)             {                 fx=event.getrawx();                 fy=event.getrawy();             }         }          if (actionperformed == motionevent.action_up)         {             switch (widgetid)             {                 case r.id.filter_gallery:                 {                     final float posx = event.getrawx();                     final float posy = event.getrawy();                      final float maxpressrange = 10.0f;                      //detect if user performed simple press                     if ((posx < fx+maxpressrange) && (posx > fx-maxpressrange))                     {                         if ((posy < fy+maxpressrange) && (posy > fy-maxpressrange))                         {                             //valid press detected!                              //convert gallery coordinates position                             final int iposition = mgallery.pointtoposition((int)event.getx(), (int)event.gety());                              if (iposition != adapterview.invalid_position)                             {                                 //this necessary obtain index of view visible , pressed                                 final int ivisibleviewindex = iposition - mgallery.getfirstvisibleposition();                                  //get reference child , modify border                                 view child = mgallery.getchildat(ivisibleviewindex);                                 if (child != null)                                 {                                     relativelayout borderimg = (relativelayout)child;                                     borderimg.setbackgroundcolor(0xffffffff);                                 }                             }                              // consume event                             return true;                         }                     }                 }//end of: case r.id.filter_gallery             }//end of: switch()         }          return false;//do not consume event otherwise ui widget touched won't receive event     }       public class galleryadapter extends baseadapter     {         //member variables         private context mcontext;         private imagebuffer mimagebuffer;           public galleryadapter(context context, imagebuffer imagebuffer)         {             mcontext = context;             mimagebuffer = imagebuffer;         }          //get count of images in gallery         public int getcount()         {             return integer.max_value;         }          public object getitem(int position)         {             if (position >= mimagebuffer.getcount())             {                  position = position % mimagebuffer.getcount();              }             return position;         }          public long getitemid(int position)         {             if (position >= mimagebuffer.getcount())             {                  position = position % mimagebuffer.getcount();              }             return position;         }          //returns individual images widget requires them         public view getview(int position, view convertview, viewgroup parent)         {             final imageview imgview = new imageview(mcontext);              if (position >= mimagebuffer.getcount())             {                  position = position % mimagebuffer.getcount();              }              imgview.setimagebitmap(mimagebuffer.getbitmapfrombuffer(position));              //put black borders around image             final relativelayout borderimg = new relativelayout(mcontext);             borderimg.setpadding(5, 5, 5, 5);             borderimg.setbackgroundcolor(0xff000000);             borderimg.addview(imgview);             return borderimg;         }     } }    import java.io.file; import java.io.ioexception; import java.io.inputstream; import java.util.arraylist; import java.util.hashmap; import java.util.list; import java.util.map;  import android.app.activity; import android.content.res.assetmanager; import android.graphics.bitmap; import android.graphics.bitmapfactory; import android.os.environment;  public class imagebuffer {     //member variables     private activity mactivity;     private map<string,integer> mindexmap;     private list<bitmap> mbitmaplist;     private int mimagecount;       public imagebuffer(activity activity)     {         mactivity = activity;         mindexmap = new hashmap<string,integer>();         mbitmaplist = new arraylist<bitmap>();         mimagecount=0;     }       public int getcount()     {         return mimagecount;     }       public int putassetbitmapinbuffer(string assetfilename, string overridefilename)     {         int ivaluetoreturn = -1;          try         {             bitmap bitmap = getbitmapfromasset(assetfilename);             if (bitmap != null)             {                 final int iindex = mbitmaplist.size();                 if (overridefilename == null)                 {                     mindexmap.put(assetfilename, iindex);                 }                 else                 {                     mindexmap.put(overridefilename, iindex);                 }                 mbitmaplist.add(bitmap);                 ivaluetoreturn = iindex;                 mimagecount++;             }         }         catch (ioexception e)         {             e.printstacktrace();         }          return ivaluetoreturn;     }       /**      * put image filesystem folder buffer      * @param filename name of file, i.e. "image.png"      * @param strsubfolder subfolder, i.e. "/products"      * @param bgetfromsdcard when true image read sdcard, otherwise main memory      * @return on success: index of image in buffer. on error: -1      */     public int putlocalfsbitmapinbuffer(string filename, string strsubfolder, boolean bgetfromsdcard)     {         int ivaluetoreturn = -1;          bitmap bitmap = getbitmapfromlocalfs(filename, strsubfolder, bgetfromsdcard);         if (bitmap != null)         {             final int iindex = mbitmaplist.size();             mindexmap.put(filename, iindex);             mbitmaplist.add(bitmap);             ivaluetoreturn = iindex;             mimagecount++;         }          return ivaluetoreturn;     }       public bitmap getbitmapfrombuffer(string assetfilename)     {         bitmap bitmap = null;          if (mindexmap.containskey(assetfilename))         {             final int iindex = mindexmap.get(assetfilename);             bitmap = mbitmaplist.get(iindex);         }          return bitmap;     }       public bitmap getbitmapfrombuffer(int position)     {         bitmap bitmap = null;          if (position < mbitmaplist.size() && position > -1)         {             bitmap = mbitmaplist.get(position);         }          return bitmap;     }       /**      * bitmap assets folder in project      * @param assetfilename name of asset, i.e. "image.png"      * @return bitmap      * @exception ioexception when file not found      */     private bitmap getbitmapfromasset(string assetfilename) throws ioexception     {         assetmanager assetmanager = mactivity.getassets();          inputstream istr = assetmanager.open(assetfilename);         bitmap bitmap = bitmapfactory.decodestream(istr);         istr.close();          return bitmap;     }       /**      * bitmap file system      * @param filename name of image, i.e. "image.png"      * @param strsubfolder subfolder, i.e. "/products"      * @param bgetfromsdcard when true image read sdcard, otherwise main memory      * @return bitmap      */     private bitmap getbitmapfromlocalfs(string filename, string strsubfolder, boolean bgetfromsdcard)     {         file file;          if (bgetfromsdcard == true)         {             //store in sdcard             file = new file(environment.getexternalstoragedirectory()+strsubfolder, filename);         }         else         {             //store in main memory             file = new file(mactivity.getfilesdir().getabsolutepath()+strsubfolder, filename);         }           bitmap bitmap = bitmapfactory.decodefile(file.getabsolutepath());          return bitmap;     }  } 

Comments