旋转框架布局,其中包含动态按钮 [英] Rotate Frame layout which contains dynamic buttons

查看:201
本文介绍了旋转框架布局,其中包含动态按钮的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个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>

和图片放在可绘制的



< a href =https://i.stack.imgur.com/CS8Uc.png =noreferrer>


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 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 i can't get the expected result i already refer this link as well https://github.com/rprouse/XkcdClock as 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 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 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

这篇关于旋转框架布局,其中包含动态按钮的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆