android - Rotate Frame layout which contains dynamic buttons -
i have framelayout add 4 imageview @ runtime in center contains main image user can perform different action face problem rotate layout view
currently on touch of rotate button i'm doing this
public void setrotatelistener() { mrotateimage.setontouchlistener(new ontouchlistener() { @override public boolean ontouch(view v, motionevent event) { float x = event.getx(0); float y = event.gety(0); float theta = gettheta(x, y); switch (event.getaction() & motionevent.action_mask) { case motionevent.action_pointer_down: theta_old = theta; break; case motionevent.action_move: float delta_theta = theta - theta_old; theta_old = theta; int direction = (delta_theta > 0) ? 1 : -1; angle += 3 * direction; log.d("tag", "rotate angle : " + obj.getheight()); obj.setrotation(angle); notifylistener(direction); break; } return true; } }); } private float gettheta(float x, float y) { float sx = x - (obj.getwidth() / 2.0f); float sy = y - (obj.getheight() / 2.0f); float length = (float) math.sqrt(sx * sx + sy * sy); float nx = sx / length; float ny = sy / length; float theta = (float) math.atan2(ny, nx); final float rad2deg = (float) (180.0 / math.pi); float thetadeg = theta * rad2deg; return (thetadeg < 0) ? thetadeg + 360.0f : thetadeg; } but can't expected result refer link https://github.com/rprouse/xkcdclock try rotate gesture , animation seems not working per move on screen
i have design layout may work need. download demo here
java file
import android.annotation.suppresslint; import android.content.context; import android.graphics.bitmap; import android.graphics.canvas; import android.graphics.color; import android.graphics.colormatrixcolorfilter; import android.graphics.paint; import android.view.gesturedetector; import android.view.layoutinflater; import android.view.motionevent; import android.view.view; import android.widget.imagebutton; import android.widget.imageview; import android.widget.relativelayout; public class clipart extends relativelayout { int baseh; int basew; int basex; int basey; imagebutton btndel; imagebutton btnrot; imagebutton btnscl; relativelayout clip; context cntx; boolean freeze = false; int h; int i; imageview image; string imageuri; boolean isshadow; int iv; relativelayout laybg; relativelayout laygroup; relativelayout.layoutparams layoutparams; public layoutinflater minflater; int margl; int margt; float opacity = 1.0f; bitmap originalbitmap; int pivx; int pivy; int pos; bitmap shadowbitmap; float startdegree; string[] v; public clipart(context paramcontext) { super(paramcontext); cntx = paramcontext; laygroup = this; basex = 0; basey = 0; pivx = 0; pivy = 0; minflater = ((layoutinflater) paramcontext.getsystemservice("layout_inflater")); minflater.inflate(r.layout.clipart, this, true); btndel = ((imagebutton) findviewbyid(r.id.del)); btnrot = ((imagebutton) findviewbyid(r.id.rotate)); btnscl = ((imagebutton) findviewbyid(r.id.sacle)); layoutparams = new relativelayout.layoutparams(250, 250); laygroup.setlayoutparams(layoutparams); image = ((imageview) findviewbyid(r.id.clipart)); image.setimageresource(r.drawable.ic_launcher); setontouchlistener(new view.ontouchlistener() { final gesturedetector gesturedetector = new gesturedetector(clipart.this.cntx, new gesturedetector.simpleongesturelistener() { public boolean ondoubletap(motionevent paramanonymous2motionevent) { return false; } }); public boolean ontouch(view paramanonymousview, motionevent event) { if (!clipart.this.freeze) { switch (event.getaction()) { case motionevent.action_down: laygroup.invalidate(); gesturedetector.ontouchevent(event); laygroup.performclick(); basex = ((int) (event.getrawx() - layoutparams.leftmargin)); basey = ((int) (event.getrawy() - layoutparams.topmargin)); break; case motionevent.action_move: int = (int) event.getrawx(); int j = (int) event.getrawy(); laybg = ((relativelayout) getparent()); if ((i - basex > -(laygroup.getwidth() * 2 / 3)) && (i - basex < laybg.getwidth() - laygroup.getwidth() / 3)) { layoutparams.leftmargin = (i - basex); } if ((j - basey > -(laygroup.getheight() * 2 / 3)) && (j - basey < laybg.getheight() - laygroup.getheight() / 3)) { layoutparams.topmargin = (j - basey); } layoutparams.rightmargin = -1000; layoutparams.bottommargin = -1000; laygroup.setlayoutparams(layoutparams); break; } return true; } return true; } }); this.btnscl.setontouchlistener(new view.ontouchlistener() { @suppresslint({ "newapi" }) public boolean ontouch(view paramanonymousview, motionevent event) { if (!clipart.this.freeze) { int j = (int) event.getrawx(); int = (int) event.getrawy(); layoutparams = (relativelayout.layoutparams) laygroup.getlayoutparams(); switch (event.getaction()) { case motionevent.action_down: clipart.this.laygroup.invalidate(); clipart.this.basex = j; clipart.this.basey = i; clipart.this.basew = clipart.this.laygroup.getwidth(); clipart.this.baseh = clipart.this.laygroup.getheight(); int[] loaction = new int[2]; laygroup.getlocationonscreen(loaction); margl = layoutparams.leftmargin; margt = layoutparams.topmargin; break; case motionevent.action_move: float f2 = (float) math.todegrees(math.atan2(i - clipart.this.basey, j - clipart.this.basex)); float f1 = f2; if (f2 < 0.0f) { f1 = f2 + 360.0f; } j -= clipart.this.basex; int k = - clipart.this.basey; = (int) (math.sqrt(j * j + k * k) * math.cos(math.toradians(f1 - clipart.this.laygroup.getrotation()))); j = (int) (math.sqrt(i * + k * k) * math.sin(math.toradians(f1 - clipart.this.laygroup.getrotation()))); k = * 2 + clipart.this.basew; int m = j * 2 + clipart.this.baseh; if (k > 150) { layoutparams.width = k; layoutparams.leftmargin = (clipart.this.margl - i); } if (m > 150) { layoutparams.height = m; layoutparams.topmargin = (clipart.this.margt - j); } clipart.this.laygroup.setlayoutparams(layoutparams); clipart.this.laygroup.performlongclick(); break; } return true; } return clipart.this.freeze; } }); this.btnrot.setontouchlistener(new view.ontouchlistener() { @suppresslint({ "newapi" }) public boolean ontouch(view paramanonymousview, motionevent event) { if (!clipart.this.freeze) { layoutparams = (relativelayout.layoutparams) clipart.this.laygroup.getlayoutparams(); clipart.this.laybg = ((relativelayout) clipart.this.getparent()); int[] arrayofint = new int[2]; laybg.getlocationonscreen(arrayofint); int = (int) event.getrawx() - arrayofint[0]; int j = (int) event.getrawy() - arrayofint[1]; switch (event.getaction()) { case motionevent.action_down: clipart.this.laygroup.invalidate(); clipart.this.startdegree = laygroup.getrotation(); clipart.this.pivx = (layoutparams.leftmargin + clipart.this.getwidth() / 2); clipart.this.pivy = (layoutparams.topmargin + clipart.this.getheight() / 2); clipart.this.basex = (i - clipart.this.pivx); clipart.this.basey = (clipart.this.pivy - j); break; case motionevent.action_move: int k = clipart.this.pivx; int m = clipart.this.pivy; j = (int) (math.todegrees(math.atan2(clipart.this.basey, clipart.this.basex)) - math.todegrees(math.atan2(m - j, - k))); = j; if (j < 0) { = j + 360; } clipart.this.laygroup.setrotation((clipart.this.startdegree + i) % 360.0f); break; } return true; } return clipart.this.freeze; } }); this.btndel.setonclicklistener(new view.onclicklistener() { public void onclick(view paramanonymousview) { if (!clipart.this.freeze) { laybg = ((relativelayout) clipart.this.getparent()); laybg.performclick(); laybg.removeview(clipart.this.laygroup); } } }); } public void disableall() { this.btndel.setvisibility(4); this.btnrot.setvisibility(4); this.btnscl.setvisibility(4); } public imageview getimageview() { return this.image; } public void setfreeze(boolean paramboolean) { this.freeze = paramboolean; } } layout file
<relativelayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <imagebutton android:id="@+id/rotate" android:layout_width="50dp" android:layout_height="50dp" android:layout_alignparentbottom="true" android:layout_alignparentleft="true" android:adjustviewbounds="true" android:background="@android:color/transparent" android:scaletype="fitcenter" android:src="@drawable/rotation"/> <imagebutton android:id="@+id/sacle" android:layout_width="50dp" android:layout_height="50dp" android:layout_alignparentbottom="true" android:layout_alignparentright="true" android:adjustviewbounds="true" android:background="@android:color/transparent" android:scaletype="fitcenter" android:src="@drawable/pointer"/> <imagebutton android:id="@+id/del" android:layout_width="50dp" android:layout_height="50dp" android:layout_alignparentright="true" android:layout_alignparenttop="true" android:adjustviewbounds="true" android:background="@android:color/transparent" android:scaletype="fitcenter" android:src="@drawable/close"/> <imageview android:id="@+id/clipart" android:layout_width="match_parent" android:layout_height="match_parent" android:padding="10dp"/> </relativelayout> and images put in drawable



Comments
Post a Comment