2012-10-04 16 views
0

我研究如何與物體在屏幕上進行交互用一個簡單的應用的問題:機器人 - 與移動和旋轉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

+0

如果我沒看錯你想拖,如果規模是再看看這裏:http://code.google.com/p/android-multitouch-controller/ – Farhan

+0

不結垢,雖然我想選擇的項目當被選擇時以稍微放大,這主要是關於旋轉和移動該圖像。(我將檢查出來反正) – BNY

回答

0

您發現CA和CB之間的角度。當角度經過180度時,三角形ABC將在線CA的另一側。因此,角度會剛剛開始下降,直到您再次回到角度爲零的CA = CB。

恐怕我不能真的建議這樣做,因爲我不明白你到底怎麼想的三角形相對於觸摸輸入旋轉的另一種方式。

+0

三角形是確定所述ImageView的被旋轉的角度。我編輯了我的文章,詳細闡述了它。希望更清楚。 – BNY

+0

也許不是返回,如果它是在左側的負角度,你可以返回360減去角度。 – Magicode