I am making an app that adds Stickers on photos. I put an ImageView in a FrameLayout and I am adding Views to it. I made the Stickers to move by dragging and scale with two fingers, but how can i make the entire View rotate by using two fingers. I also DO NOT NEED the image to rotate inside of the view, but the entire View to rotate. Here is my code:
final ImageView newSticker = new ImageView(getApplicationContext());
newSticker.setLayoutParams(new FrameLayout.LayoutParams(FrameLayout.LayoutParams.WRAP_CONTENT,FrameLayout.LayoutParams.WRAP_CONTENT));
Bitmap sticker = BitmapFactory.decodeResource(getResources(),stickerArray.getResourceId(position,0));
newSticker.setImageBitmap(sticker);
viewGroup.addView(newSticker);
if(selectedSticker != null)
selectedSticker.setBackgroundColor(getResources().getColor(android.R.color.transparent));
selectedSticker = newSticker;
newSticker.setBackgroundResource(R.drawable.sticker_border);
newSticker.setOnTouchListener(new View.OnTouchListener()
{
PointF DownPT = new PointF();
PointF StartPT = new PointF();
float olddistance,oldrotation;
float height, width;
float oldK;
float lineA;
float m1;
@Override
public boolean onTouch(View v, MotionEvent event)
{
if(selectedSticker != null)
selectedSticker.setBackgroundColor(getResources().getColor(android.R.color.transparent));
selectedSticker = newSticker;
newSticker.setBackgroundResource(R.drawable.sticker_border);
switch (event.getAction() & MotionEvent.ACTION_MASK)
{
case MotionEvent.ACTION_MOVE :
if(event.getPointerCount() == 1)
{
float x =StartPT.x + event.getX() - DownPT.x;
float y = StartPT.y + event.getY() - DownPT.y;
newSticker.setX((int) (StartPT.x + event.getX() - DownPT.x));
newSticker.setY((int) (StartPT.y + event.getY() - DownPT.y));
Log.i("MOVE","Moved to x="+x+" and y="+y);
Log.i("MOVE","StartPT x="+StartPT.x+" y="+StartPT.y);
Log.i("MOVE","DownPT x="+DownPT.x+" y="+DownPT.y);
}
else if(event.getPointerCount() == 2)
{
newSticker.setX((int) (StartPT.x + event.getX(0) - DownPT.x));
newSticker.setY((int) (StartPT.y + event.getY(0) - DownPT.y));
final float dX =event.getX(0) - event.getX(1);
final float dY =event.getY(0) - event.getY(1);
float newdistance = (float) Math.sqrt(dX * dX + dY * dY);
float distance = newdistance - olddistance;
float newWidth = ((width+distance > 150) ? (width + distance) : 150 );
float newHeight = ((height+distance > 150) ? (height + distance) : 150 );
FrameLayout.LayoutParams lp= new FrameLayout.LayoutParams((int) (newWidth), (int) (newHeight));
newSticker.setLayoutParams(lp);
Log.i("ROTATION","dX="+dX+" dY="+dY);
double radians = Math.atan2(dY, dX);
Log.i("ROTATION","Radians="+radians);
float newRot = (float) Math.toDegrees(radians);
Log.i("ROTATION","Old Angle="+oldrotation);
Log.i("ROTATION","New Angle="+newRot);
float r = newRot - oldrotation;
Log.i("ROTATION","Rotate to="+r);
newSticker.setRotation((int) r);
Log.i("ROTATION","ROTATION SET");
}
StartPT.set( newSticker.getX(), newSticker.getY() );
Log.i("ROTATION","STARTPT SET");
break;
case MotionEvent.ACTION_DOWN :
DownPT.set(event.getX(), event.getY());
StartPT.set(newSticker.getX(), newSticker.getY());
Log.i("ACTION DOWN","DownPT x="+event.getX()+" y="+event.getY());
Log.i("ACTION DOWN","StartPT x="+newSticker.getX()+" y="+newSticker.getY());
break;
case MotionEvent.ACTION_POINTER_DOWN:
height = newSticker.getHeight();
width = newSticker.getWidth();
final float odX =event.getX(0) - event.getX(1);
final float odY =event.getY(0) - event.getY(1);
olddistance = (float) Math.sqrt(odX * odX + odY * odY);
double oldradians = Math.atan2(odY, odX);
oldrotation = (float) Math.toDegrees(oradians);
oldrotation = newSticker.getRotation();
Log.i("ACTION POINTER DOWN","odX="+odX+" odY="+odY);
Log.i("ACTION POINTER DOWN","Old Rotation="+oldrotation);
break;
case MotionEvent.ACTION_POINTER_UP :
height = newSticker.getHeight();
width = newSticker.getWidth();
break;
default :
break;
}
return true;
}
});
I solved it like this