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
- apparently-endless horizontal scrolling
- selection detection without using godawful gallery.setonitemselectedlistener().
- 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
Post a Comment