화면에 버튼을 몇개 놔뒀습니다
그중에 이동과 회전 버튼이 있습니다.
그리고 각각의 버튼을 클릭시
SelectFunction에 값을 변경하여
터치 이벤트가 일어날때 이동을 할건지 회전을 할건지 하는겁니다
각각의 이벤트는 문제없이 잘 일어나구요
그런데 문제가 되는게 회전했다가 이동으로 바꿔서 이미지를 이동시키면
회전을 많이 한경우 이동만해도
이미지가 이동을 하기는 하는데 점점 큰원을 그리며 화면 밖으로 사라집니다 ㅠ.ㅠ
관련 소스를 올립니다
고수님들 보시고
회전하다가 이동할때 화면 밖으로 사라지지 않게좀 도와주세요
그리고 또 문제가 되는게 이미지뷰를 추가할때 이미지뷰들의 위치가 다 초기값을로 돌아가던데 이문제 해결방법 있나요??
소스 보시고 도움좀 주세요 ㅠ.ㅠ
import android.os.Bundle;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.pm.ActivityInfo;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Matrix;
import android.graphics.PointF;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup.LayoutParams;
import android.view.Window;
import android.view.WindowManager;
import android.widget.Button;
import android.widget.FrameLayout;
import android.widget.ImageView;
import android.widget.ImageView.ScaleType;
import android.widget.TextView;
import android.widget.Toast;
public class MainActivity extends Activity {
private ImageView selectImage;

private int preX;
private int preY;
private int x;
private int y;
private int selX;
private int selY;

private int tx;
private int ty;

private int allowGap = 3;
FrameLayout l;
ImageView img[] = new ImageView[5];

String SelectFunction = null;

double degree = 0;

private double cX, cY, sX, sY, eX, eY;
TextView textV;


@Override
public void onCreate(Bundle savedInstanceState) {
this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

SelectFunction = "Move";

l = (FrameLayout)findViewById(R.id.basic);

img[0] = (ImageView)findViewById(R.id.img1);
img[0].setOnTouchListener(touchListener);
img[1] = (ImageView)findViewById(R.id.img2);
img[1].setOnTouchListener(touchListener);

Button btn1 = (Button)findViewById(R.id.btn3);
Button btn2 = (Button)findViewById(R.id.btn4);
Button btn3 = (Button)findViewById(R.id.btn5);
Button btnMove = (Button)findViewById(R.id.btnMove);
Button btnRotate = (Button)findViewById(R.id.btnRotate);
textV = (TextView)findViewById(R.id.textView);
selectImage = null;


findViewById(R.id.btn1).setOnClickListener(clickListener);
findViewById(R.id.btn2).setOnClickListener(clickListener);

btn1.setOnClickListener(new View.OnClickListener() {

@Override
public void onClick(View v) {
// TODO Auto-generated method stub
Bitmap bm = BitmapFactory.decodeResource(getResources(), R.drawable.car);
Log.d("크기", "가로 : " + bm.getWidth() + " 세로 : " + bm.getHeight());
Matrix m = new Matrix();
m.postTranslate(0, 0);
img[2] = new ImageView(getBaseContext());
img[2].setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
img[2].setScaleType(ScaleType.MATRIX);
img[2].setImageBitmap(bm);
img[2].setImageMatrix(m);
l.addView(img[2]);
img[2].setOnTouchListener(touchListener);
}
});

btn2.setOnClickListener(new View.OnClickListener() {

@Override
public void onClick(View v) {
// TODO Auto-generated method stub
Bitmap bm = BitmapFactory.decodeResource(getResources(), R.drawable.car2);
Log.d("크기", "가로 : " + bm.getWidth() + " 세로 : " + bm.getHeight());
Matrix m = new Matrix();
m.postTranslate(0, 0);
img[3] = new ImageView(getBaseContext());
img[3].setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
img[3].setScaleType(ScaleType.MATRIX);
img[3].setImageBitmap(bm);
img[3].setImageMatrix(m);
l.addView(img[3]);
img[3].setOnTouchListener(touchListener);
}
});
btn3.setOnClickListener(new View.OnClickListener() {

@Override
public void onClick(View v) {
// TODO Auto-generated method stub
Bitmap bm = BitmapFactory.decodeResource(getResources(), R.drawable.car3);
Log.d("크기", "가로 : " + bm.getWidth() + " 세로 : " + bm.getHeight());
Matrix m = new Matrix();
m.postTranslate(0, 0);
img[4] = new ImageView(getBaseContext());
img[4].setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
img[4].setScaleType(ScaleType.MATRIX);
img[4].setImageBitmap(bm);
img[4].setImageMatrix(m);
l.addView(img[4]);
img[4].setOnTouchListener(touchListener);
}
});

btnMove.setOnClickListener(new View.OnClickListener() {

@Override
public void onClick(View v) {
// TODO Auto-generated method stub
SelectFunction = "Move";
}
});

btnRotate.setOnClickListener(new View.OnClickListener() {

@Override
public void onClick(View v) {
// TODO Auto-generated method stub
SelectFunction = "Rotate";
}
});

}

public void view_coordinate(ImageView v){
String imgname = "";
switch(v.getId()){
case R.id.img1: imgname = "Image1"; break;
case R.id.img2: imgname = "Image2"; break;
}
toMessage(
imgname + " 좌표: (" + v.getLeft() + ", " + v.getTop()
+ ", " + v.getRight() + ", " + v.getBottom() + ")"
);
}

View.OnClickListener clickListener = new View.OnClickListener() {
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.btn1: view_coordinate(img[0]); break;
case R.id.btn2: view_coordinate(img[1]); break;
}
}
};

View.OnTouchListener touchListener = new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
if(SelectFunction == "Move"){
x = (int)event.getX();
y = (int)event.getY();
switch ( event.getAction() ) {
case MotionEvent.ACTION_DOWN:
if(selectImage == null){
selectImage = (ImageView)v;
Toast.makeText(MainActivity.this, v + "", Toast.LENGTH_SHORT).show();
selectImage.bringToFront();

selX = preX = x;
selY = preY = y;
return true;
}
break;
case MotionEvent.ACTION_MOVE:
if(selectImage == (ImageView)v){
tx = x - preX;
ty = y - preY;
if( ((tx > -allowGap) && (tx < allowGap)) && ((ty > -allowGap) && (ty < allowGap)) ){
return false;
}else{
tx = x - selX;
ty = y - selY;
selectImage.layout(selectImage.getLeft() + tx, selectImage.getTop() + ty,
selectImage.getRight() + tx, selectImage.getBottom() + ty);
preX = x;
preY = y;
return true;
}
}
break;
case MotionEvent.ACTION_UP:
if(selectImage != null){
selectImage = null;
return true;
}
break;
}
return false;
}else if(SelectFunction == "Rotate"){

sX = (double)event.getX();
sY = (double)event.getY();

switch (event.getAction() & MotionEvent.ACTION_MASK) {
case MotionEvent.ACTION_DOWN:
eX = (double)event.getX();
eY = (double)event.getY();
if(selectImage == null){
selectImage = (ImageView)v;

return true;
}
break;
case MotionEvent.ACTION_UP:
if(selectImage != null){
selectImage = null;
return true;
}
break;
case MotionEvent.ACTION_MOVE:
cX = (double)selectImage.getX();
cY = (double)selectImage.getY();
Double showDegree = ComputeRotateAngle(cX, cY, sX, sY, eX, eY);
//Log.d("멍미", cX + "_______" + cY + "_______" + sX + "_______" + sY + "_______" + eX + "_______" + eY + "값:" + showDegree);
degree += showDegree;
selectImage.setRotation((int)degree);
//textV.setText(showDegree + "");
sX = (double)event.getX();
sY = (double)event.getY();
break;
}
return true; // indicate event was handled

}else{
return false;
}

}
};


Toast tempToast;
public void toMessage(String str){
if(tempToast==null){
tempToast = Toast.makeText(getApplicationContext(), str, Toast.LENGTH_LONG);
}else{
tempToast.setText(str);
}
tempToast.show();
}
public void toAlert(String str){
new AlertDialog.Builder(getApplicationContext())
.setMessage(str)
.setCancelable(false)
.setNegativeButton("닫기", null)
.show();
}

//각도 구하기
public double ComputeRotateAngle(double cX, double cY, double sX, double sY, double eX, double eY){
double ang1, ang2;

ang1 = ComputeTheta(cX, cY, sX, sY);
ang2 = ComputeTheta(cX, cY, eX, eY);

return ang2 - ang1;
}

public double FindAngle(double th1, double th2){
double M_PI = 180/Math.PI;
double ang, d1, d2;
ang = 0;
d1 = th1;
d2 = th2;

if(th1 != 0){
ang = Math.atan(d2/d1)*M_PI;
}else{
if(th2 > 0){
ang = 90;
}else if(th2 < 0){
ang = -90;
}else if(th2 == 0){
ang = 0;
}
}
return ang;
}

public double ChangeAngle(double ang){
if(ang > 0){
return ang - 180;
}else if(ang < 0){
return ang + 180;
}else{
return 0;
}
}

public double ComputeTheta(double X1, double Y1, double X2, double Y2){
double ang1;
ang1 = FindAngle(X1 - X2, Y1 - Y2);
if(X1 > X2){
ang1 = ChangeAngle(ang1);
}
if(ang1 < 0){
ang1 = 360 + ang1;
}
if(ang1 == 0 & X1 > X2){
ang1 = 180;
}
return ang1;
}
/////////////
}