我研究如何與物體在屏幕上進行交互用一個簡單的應用的問題:機器人 - 與移動和旋轉ImageView的
我有一個ImageView
可以用一個指針移動,並使用第二指針旋轉。 當視圖被觸摸時,它會稍微增加尺寸並在發佈時恢復到原始尺寸。 我有2個問題與此應用:
- 的0°和180°;
- 被釋放後的圖像也會被剪裁。
我不知道這是否可以很容易地解決,或者我需要徹底改變我的方法,但任何幫助/提示,非常感謝。
這裏是我的代碼:
main.xml中是一個空的RelativeLayout。
public class MainActivity extends Activity{
ImageView image;
ViewGroup group;
int oldX, oldY;
static float x1,y1, degrees, width,height;
RelativeLayout.LayoutParams startLayoutParams;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
group = (ViewGroup)findViewById(R.id.root);
image = new ImageView(this);
image.setImageResource(R.drawable.androids);//set image(80x80px)
image.setOnTouchListener(touch);
startLayoutParams = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT);
startLayoutParams.leftMargin = 50;
startLayoutParams.topMargin = 50;
startLayoutParams.bottomMargin = -250;
startLayoutParams.rightMargin = -250;
image.setLayoutParams(startLayoutParams);
group.addView(image);
}//end onCreate
public OnTouchListener touch = new OnTouchListener() {
RelativeLayout.LayoutParams downParams, upParams, moveParams;
@Override
public boolean onTouch(View view, MotionEvent event) {
final int X = (int) event.getRawX();
final int Y = (int) event.getRawY();
switch (event.getAction() & MotionEvent.ACTION_MASK) {
case MotionEvent.ACTION_DOWN:
((ImageView)view).setImageResource(R.drawable.android);//set slightly larger image(100x100px)
downParams = (RelativeLayout.LayoutParams) view.getLayoutParams();
downParams.leftMargin = downParams.leftMargin-10;//adjust margin to compensate for larger image
downParams.topMargin = downParams.topMargin-10;
downParams.bottomMargin = -250;
downParams.rightMargin = -250;
view.setLayoutParams(downParams);
oldX = X - downParams.leftMargin;//get starting position
oldY = Y - downParams.topMargin;
break;
case MotionEvent.ACTION_UP:
((ImageView)view).setImageResource(R.drawable.androids);//Reset smaller image
upParams = (RelativeLayout.LayoutParams) view.getLayoutParams();
upParams.leftMargin += 10;//re-adjust margin
upParams.topMargin += 10;
upParams.bottomMargin = -250;
upParams.rightMargin = -250;
view.setLayoutParams(upParams);
break;
case MotionEvent.ACTION_POINTER_2_DOWN:
x1=event.getX(1);// get starting coordinates for calculating degrees to rotate
y1=event.getY(1);
break;
case MotionEvent.ACTION_MOVE:
int pointer = event.getPointerId(0);
int pointerCount = event.getPointerCount();
moveParams = (RelativeLayout.LayoutParams) view.getLayoutParams();
moveParams.leftMargin = X - oldX;//get new position
moveParams.topMargin = Y - oldY;
moveParams.rightMargin = -250;
moveParams.bottomMargin = -250;
if (pointerCount == 1) {//move image
view.setLayoutParams(moveParams);
}else if(pointerCount == 2){//move and rotate image
for(int i = 0 ; i<pointerCount;i++){
if(event.getPointerId(i)==pointer){
view.setLayoutParams(moveParams);//move
}//end if
}//end for
degrees = getDegrees(event);
width = ((ImageView)view).getDrawable().getBounds().width();
height = ((ImageView)view).getDrawable().getBounds().height();
Matrix matrix=new Matrix();
((ImageView)view).setScaleType(ScaleType.MATRIX); //required
matrix.postRotate(degrees, width/2, height/2);//rotate
((ImageView)view).setImageMatrix(matrix);
}//end if-else if
break;
}//end switch-case
group.invalidate();
return true;
}//end onTouch
};//end OnTouchListener touch
public static float getDegrees(MotionEvent event){
float x0,y0, x2,y2, A,B,C, angle,cosa;
x0 = event.getX(0);
y0 = event.getY(0);
x2 = event.getX(1);
y2 = event.getY(1);
A = FloatMath.sqrt(sq(x0-x1) + sq(y0-y1));
B = FloatMath.sqrt(sq(x0-x2) + sq(y0-y2));
C = FloatMath.sqrt(sq(x2-x1) + sq(y2-y1));
cosa = (sq(A)+sq(B)-sq(C))/(2*A*B);
angle = (float) Math.toDegrees(Math.acos(cosa));
return (x0<=x2) ? angle : opposite(angle);
}//end getDegrees
private static float sq(float input){
return (float) Math.pow(input, 2);
}//end square
private static float opposite(float value){
return value-(2*value);
}//end opposite
}//end MainActivity
我意識到人們對這個問題的許多問題,我讀過數十人,並嘗試了他們的了,但依然存在問題或其他的站起身來,所以我決定發佈這個問題。在getDegrees()
信息:
我不能發佈的圖像,以便檢查:http://i50.tinypic.com/vsjl28.jpg
- P0 =(X0,Y0)=所述第一指針的當前位置
- p1 =(x1,y1)= 第二個指針第一個放下
- p2 =(x2,y2)= 第二個指針的當前位置如果第二指針位於右視線第一指針Ç的在它的左側,當負值的
getDegrees()返回角度c。
如果我沒看錯你想拖,如果規模是再看看這裏:http://code.google.com/p/android-multitouch-controller/ – Farhan
不結垢,雖然我想選擇的項目當被選擇時以稍微放大,這主要是關於旋轉和移動該圖像。(我將檢查出來反正) – BNY