view - Android getWidth, getHeight, getLeft, getRight not correct after setScaleX() , setScaleY() -



view - Android getWidth, getHeight, getLeft, getRight not correct after setScaleX() , setScaleY() -

i seek implement zoom in/out spread/pinch gesture , drag , drop functions on relative layout.

this code of onpinchlistener handle zoom effect. mainview relativelayout defined in layout xml file.

i implement touch listener in fakeview should in front end of view. touch event alter mainview according code.

i want inquire if possible actual left, top, width , height after scale? homecoming 0,0 left , top, , original width , height after zoom.

thanks much!

<?xml version="1.0" encoding="utf-8"?> <relativelayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/linear_layout" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" > <relativelayout android:id="@+id/zoomable_relative_layout" android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_alignparentleft="true" android:layout_alignparenttop="true" > <imageview android:id="@+id/imageview1" android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_alignparentleft="true" android:layout_alignparenttop="true" android:src="@drawable/background" /> </relativelayout> <relativelayout android:id="@+id/relative_layout" android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_alignparentleft="true" android:layout_alignparenttop="true" android:orientation="vertical" > </relativelayout> </relativelayout> public class mainactivity extends activity { //zoomablerelativelayout mainview = null; relativelayout mainview = null; relativelayout rl = null; public static final string tag = "zoomtext." + mainactivity.class.getsimplename(); private int offset_x; private int offset_y; private boolean dragmutex = false; relativelayout fakeview = null; float width = 0, height = 0; private ontouchlistener listener = new ontouchlistener() { @override public boolean ontouch(view arg0, motionevent event) { // log.e(tag, event + ""); // log.e(tag, "pointer count = "+event.getpointercount()); log.e(tag, event.getx() + "," + event.gety() + "|" + mainview.getx() + "(" + mainview.getwidth() + ")," + mainview.gety() + "(" + mainview.getheight() + ")"); if (event.getx() >= mainview.getleft() && event.getx() <= mainview.getleft() + mainview.getwidth() && event.gety() >= mainview.gettop() && event.gety() <=mainview.gettop() + mainview.getheight()) if (event.getpointercount() > 1) { homecoming scalegesturedetector.ontouchevent(event); } else { homecoming lllistener.ontouch(arg0, event); } homecoming false; } }; private scalegesturedetector scalegesturedetector; private ontouchlistener lllistener = new ontouchlistener() { @override public boolean ontouch(view v, motionevent event) { // todo auto-generated method stub // log.d(tag, event + ",ll"); switch (event.getaction() & motionevent.action_mask) { case motionevent.action_down: offset_x = (int) event.getx(); offset_y = (int) event.gety(); // log.e(tag, offset_x + "," + offset_y); dragmutex = true; homecoming true; case motionevent.action_move: // log.e(tag, "finger down"); int x = (int) event.getx() - offset_x; int y = (int) event.gety() - offset_y; log.e(tag, event.getx() + "," + event.gety()); float _x = mainview.getx(); float _y = mainview.gety(); mainview.setx(_x + x); mainview.sety(_y + y); offset_x = (int) event.getx(); offset_y = (int) event.gety(); homecoming true; case motionevent.action_up: dragmutex = false; homecoming true; } homecoming false; } }; private ondraglistener draglistener = new view.ondraglistener() { @override public boolean ondrag(view arg0, dragevent arg1) { log.e(tag, "drag listener = " + arg1); homecoming false; } }; @override public void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.activity_main); mainview = (relativelayout) findviewbyid(r.id.zoomable_relative_layout); // mainview.setontouchlistener(new onpinchlistener()); // mainview.setontouchlistener(listener); scalegesturedetector = new scalegesturedetector(this, new onpinchlistener()); rl = (relativelayout) findviewbyid(r.id.linear_layout); mainview.setondraglistener(draglistener); // mainview.setontouchlistener(lllistener); fakeview = (relativelayout) findviewbyid(r.id.relative_layout); fakeview.setontouchlistener(listener); } class onpinchlistener extends simpleonscalegesturelistener { float startingspan; float endspan; float startfocusx; float startfocusy; public boolean onscalebegin(scalegesturedetector detector) { startingspan = detector.getcurrentspan(); startfocusx = detector.getfocusx(); startfocusy = detector.getfocusy(); homecoming true; } public boolean onscale(scalegesturedetector detector) { // mainview.scale(detector.getcurrentspan() / startingspan, // startfocusx, startfocusy); // if(width==0) // width = mainview.getwidth(); // if(height==0) // height = mainview.getheight(); mainview.setpivotx(startfocusx); mainview.setpivoty(startfocusy); mainview.setscalex(detector.getcurrentspan() / startingspan); mainview.setscaley(detector.getcurrentspan() / startingspan); // layoutparams para = mainview.getlayoutparams(); // width*=detector.getcurrentspan() / startingspan; // height*=detector.getcurrentspan() / startingspan; // para.width = (int)width; // para.height = (int)height; // mainview.setlayoutparams(para); homecoming true; } public void onscaleend(scalegesturedetector detector) { //mainview.restore(); mainview.invalidate(); log.e(tag, mainview.getleft()+","+mainview.getright()); } } }

you need transformation matrix , utilize transform original points.

so (after scaling):

matrix m = view.getmatrix(); //gives transform matrix m.mappoints(newpoints, oldpoints); //transform original points.

android view drag-and-drop zoom

Comments

Popular posts from this blog

web services - java.lang.NoClassDefFoundError: Could not initialize class net.sf.cglib.proxy.Enhancer -

Accessing MATLAB's unicode strings from C -

javascript - mongodb won't find my schema method in nested container -