本文介绍了旋转框架布局,其中包含动态按钮的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧! 问题描述 29岁程序员,3月因学历无情被辞! 我有一个Framelayout,它在运行时添加了四个imageview,在中心它包含主图像,用户可以使用该图像执行不同的操作但我面临旋转布局视图的问题 目前正在触摸旋转按钮我正在这样做 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; 角度+ = 3 *方向; Log.d(Tag,rotate angle:+ obj.getHeight()); obj.setRotation(angle); notifyListener(direction); 休息; } 返回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; 返回(thetaDeg< 0)? thetaDeg + 360.0f:thetaDeg; } 但是我无法得到预期的结果我已经引用此链接了 Java文件 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; 公共类ClipArt扩展RelativeLayout { int baseh; int basew; int basex; int basey; ImageButton btndel; ImageButton btnrot; ImageButton btnscl; RelativeLayout剪辑; 上下文cntx; boolean freeze = false; int h; int i; ImageView图片; String imageUri; boolean isShadow; int iv; RelativeLayout layBg; RelativeLayout layGroup; RelativeLayout.LayoutParams layoutParams; public LayoutInflater mInflater; int margl; int margt; 浮动不透明度= 1.0F; 位图originalBitmap; int pivx; int pivy; int pos; 位图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() - layoutPara ms.topMargin)); 休息; case MotionEvent.ACTION_MOVE: int i =(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); 休息; } 返回true; } 返回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 i =(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; 休息; 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 = i - ClipArt.this.basey; i =(int)(Math.sqrt(j * j + k * k) * Math.cos(Math.toRadians(f1 - ClipArt.this.layGroup.getRotation()))); j =(int)(Math.sqrt(i * i + k * k) * Math.sin(Math.toRadians(f1 - ClipArt.this.layGroup.getRotation()))); k = i * 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(); 休息; } 返回true; } 返回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 i =(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); 休息; 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,i - k) ))); i = j; if(j< 0){ i = j + 360; } ClipArt.this.layGroup.setRotation((ClipArt.this.startDegree + i)%360.0F); 休息; } 返回true; } 返回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; } } 布局文件 < RelativeLayout xmlns:android =http://schemas.android.com/apk/res/androidandroid:layout_width =match_parentandroid:layout_height = match_parent > < ImageButton android:id =@ + id / rotateandroid:layout_width =50dpandroid:layout_height =50dpandroid:layout_alignParentBottom =trueandroid:layout_alignParentLeft =trueandroid:adjustViewBounds = trueandroid:background =@ android:color / transparentandroid:scaleType =fitCenterandroid:src =@ drawable / rotation/> < ImageButton android:id =@ + id / sacleandroid:layout_width =50dpandroid:layout_height =50dpandroid:layout_alignParentBottom =trueandroid:layout_alignParentRight =trueandroid:adjustViewBounds = trueandroid:background =@ android:color / transparentandroid:scaleType =fitCenterandroid:src =@ drawable / pointer/> < ImageButton android:id =@ + id / delandroid:layout_width =50dpandroid:layout_height =50dpandroid:layout_alignParentRight =trueandroid:layout_alignParentTop =trueandroid:adjustViewBounds = trueandroid:background =@ android:color / transparentandroid:scaleType =fitCenterandroid:src =@ drawable / close/> < ImageView android:id =@ + id / clipartandroid:layout_width =match_parentandroid:layout_height =match_parentandroid:padding =10dp/> < / RelativeLayout> 和图片放在可绘制的 I have a Framelayout which add four imageview at runtime as well in center it contains main image with which user can perform different action but i face the problem with rotate layout viewcurrently on touch of rotate button i'm doing thispublic 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 i can't get the expected result i already refer this link as wellhttps://github.com/rprouse/XkcdClockas well as try to rotate with gesture and animation too but it seems not working as per my move on the screen 解决方案 I have Design A Layout that may work as your need.Download Demo hereJava Fileimport 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 i = (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 i = (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 = i - ClipArt.this.basey; i = (int) (Math.sqrt(j * j + k * k) * Math.cos(Math.toRadians(f1 - ClipArt.this.layGroup.getRotation()))); j = (int) (Math.sqrt(i * i + k * k) * Math.sin(Math.toRadians(f1 - ClipArt.this.layGroup.getRotation()))); k = i * 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 i = (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, i - k))); i = j; if (j < 0) { i = 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 这篇关于旋转框架布局,其中包含动态按钮的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持! 上岸,阿里云!
05-27 09:22
查看更多