2012-02-03 43 views
1

對於android來說,我所做的所有嘗試都是爲了編寫一個應用程序,並且只有很少的視圖與用戶進行交互。我的方法是用xml文件中的一些imageviews定義佈局,並以編程方式處理這些圖像視圖上的事件。 但我遇到了將.setOnTouchListener()分配給先前在xml中定義的RelativeLayout的問題。將.setOnTouchListener()分配給在xml中定義的佈局

代碼如下所示:

public class ThreeActivity extends Activity implements OnTouchListener { 

    ImageView iv2; 
    RelativeLayout rl; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     // TODO Auto-generated method stub 
     super.onCreate(savedInstanceState); 

     setContentView(R.layout.fish); 

     ImageView iv1 = (ImageView) findViewById(R.id.ImageView02); 
     iv1.setAlpha(50); 


     iv2 = (ImageView) findViewById(R.id.ImageView01); 
     iv2.setId(2); 
     iv2.setOnTouchListener(this); 

     iv2.setFocusable(true); 

    } 

    @Override 
    public boolean onTouch(View v, MotionEvent event) { 

     if (iv2.isFocused()) { 
      TranslateAnimation translateAnim = new TranslateAnimation(
        iv2.getLeft(), event.getX(), iv2.getTop(), event.getY()); 

      translateAnim.setDuration(1000); 
      translateAnim 
        .setInterpolator(new AccelerateDecelerateInterpolator()); 
      translateAnim.setFillAfter(true); 

      iv2.setAnimation(translateAnim); 

      iv2.startAnimation(translateAnim); 
     } 
     return true; 
     } 


} 

很明顯,我想要一個imageview的要成爲焦點,以收到多個事件和比它移動到觸摸的位置。這就是我進入麻煩的地方。我感動的RelativeLayout只是沒有設置觸摸監聽器,所以我無法與它進行交互。

你能幫我解決這個問題還是推薦另一種方法? 感謝您的幫助!

回答

0
public class ThreeActivity extends Activity implements OnTouchListener { 

    ImageView iv2; 
    RelativeLayout rl; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     // TODO Auto-generated method stub 
     super.onCreate(savedInstanceState); 

     setContentView(R.layout.fish); 

     ImageView iv1 = (ImageView) findViewById(R.id.ImageView02); 
     iv1.setAlpha(50); 


     iv2 = (ImageView) findViewById(R.id.ImageView01); 
     iv2.setId(2); 
     r1.setOnTouchListener(this); 

     iv2.setFocusable(true); 

    } 

    @Override 
    public boolean onTouch(View v, MotionEvent event) { 

     if (v == iv2) { 
      TranslateAnimation translateAnim = new TranslateAnimation(
        iv2.getLeft(), event.getX(), iv2.getTop(), event.getY()); 

      translateAnim.setDuration(1000); 
      translateAnim 
        .setInterpolator(new AccelerateDecelerateInterpolator()); 
      translateAnim.setFillAfter(true); 

      iv2.setAnimation(translateAnim); 

      iv2.startAnimation(translateAnim); 
     } 
     return true; 
     } 


} 
1

我建議您閱讀一點關於MotionEvent的課。請特別注意getAction()方法以及此類爲您提供的所有動作蒙版。

在您onTouch()方法,你可以做這樣的事情:

if (v != iv2) return; 
switch(ev.getAction()) {  
    case ACTION_DOWN: { 
     // This block will run when the finger touches the screen 
     mDoDrag = true; 
     break; 
    }  
    case ACTION_UP: { 
     // This block will run when the finger leaves the screen 
     mDoDrag = false; 
     break; 
    }  
    case ACTION_MOVE: { 
     // This block will run when the finger is dragged across the screen 
     if (mDoDrag) { 
      // You should implement your animation here 
     } 
     break; 
    } 
} 
+0

對不起,但沒有這個soulutinos正在工作:( 解決方案2號的ImageView仍然只是在由imageview iv2本身定義的方塊上進行偵聽,並且解決方案1號產生NullPointException! – greengold 2012-02-04 11:28:40

+0

您必須爲所有ImageViews設置偵聽器並在onTouch()方法,v參數是對vi的引用新聞被觸及 – 2012-02-06 01:53:39

+0

我想你沒有得到我的問題。 我希望我的對象(圖像視圖)能夠移動到我點擊的任何位置。當然,如果我想要與所有圖像瀏覽器交互,我會將它們分配在TouchListener上並進行關注,而不是檢查onTouch方法中的特定視圖,如果它被移動到應該移動的位置。 事情是,我不能告訴他們在哪裏移動原因RelativeLayout在這個例子中沒有分配onTouchListener,所以我無法獲得座標。 – greengold 2012-02-07 00:48:36

0

如果setOnTouchListener不適合你的佈局工作,你可以擴展它,並處理onInterceptTouchEvent