2012-03-29 8 views
0

私はAndroidアプリケーションを作成していますが、LinearLayoutのビューをメインコンテナRelativeLayoutにドラッグしてから、RelativeLayoutに追加した後にそのビューのOnTouchListenerを設定し直す必要があります。問題はビューを追加した後に不適切に動作することです、私は、ビューの左または上に触れると、ビューが左または上に移動することを意味するので、これは起こらないはずです。オンタッチ・リスナーは、ビューの左上をクリックすると左上に移動するのはなぜですか?

私は景色がひどく振る舞う理由のような理由を見つけようとしてきたが、一つの理由の可能性がないフィギュア、誰かがここに私を助けてくださいすることができ、ここで

は私のコードです。 ...

public class MovingViewsActivity extends Activity implements OnTouchListener { 
    int i = 0; 
    Button btn; 
    private Button btn1, btn2, btn3; 
    private RelativeLayout layout; 
    private LayoutParams params; 
    List<ImageView> imgList; 
    private ImageView image; 

    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
     imgList = new ArrayList<ImageView>(); 
     layout = (RelativeLayout) findViewById(R.id.LinearLayout01); 
     params = new LayoutParams(LayoutParams.WRAP_CONTENT, 
       LayoutParams.WRAP_CONTENT); 
     btn = (Button) findViewById(R.id.btn); 
     btn.setDrawingCacheEnabled(true); 
     btn1 = (Button) findViewById(R.id.btn1); 
     btn1.setDrawingCacheEnabled(true); 
     btn2 = (Button) findViewById(R.id.btn2); 
     btn2.setDrawingCacheEnabled(true); 
     btn3 = (Button) findViewById(R.id.btn3); 
     btn3.setDrawingCacheEnabled(true); 
     btn.setOnTouchListener(this); 
     btn1.setOnTouchListener(this); 
     btn2.setOnTouchListener(this); 
     btn3.setOnTouchListener(this); 

    } 

    OnTouchListener dragit = new OnTouchListener() { 

     public boolean onTouch(View v, MotionEvent event) { 
      RelativeLayout.LayoutParams params = (android.widget.RelativeLayout.LayoutParams) v 
        .getLayoutParams(); 

      if (event.getAction() == MotionEvent.ACTION_DOWN) { 

      } else if (event.getAction() == MotionEvent.ACTION_UP) { 

      } else if (event.getAction() == MotionEvent.ACTION_MOVE) { 

       params.topMargin = (int) event.getRawY() - (v.getHeight()) - 30; 
       params.leftMargin = (int) event.getRawX() - (v.getWidth()) + 30; 
       v.setLayoutParams(params); 
      } 
      v.invalidate(); 
      return true; 

     } 

    }; 

    public boolean onTouch(View v, MotionEvent event) { 

     if (event.getAction() == MotionEvent.ACTION_DOWN) { 
      i++; 
      image = new ImageView(getApplicationContext()); 
      image.setImageBitmap(btn1.getDrawingCache()); 
      image.setId(i); 
      image.setVisibility(View.INVISIBLE); 
      layout.addView(image, params); 
      imgList.add(image); 
      Log.d("Number of VIEWS", "Number of VIEWS " + imgList.size() 
        + " ID: " + image.getId()); 
      v.getParent().requestDisallowInterceptTouchEvent(true); 

     } 
     if (event.getAction() == MotionEvent.ACTION_UP) { 
     } 
     if (event.getAction() == MotionEvent.ACTION_MOVE) { 
      image.setVisibility(View.VISIBLE); 

      int left = (int) event.getRawX() - (v.getWidth()/2); 
      int top = (int) event.getRawY() - (v.getHeight()); 
      image.setPadding(left, top, 0, 0); 

      image.invalidate(); 

     } 
     for (ImageView img : imgList) { 

      img.setOnTouchListener(dragit); 

     } 
     return true; 
    } 

} 

ご協力いただければ幸いです。

答えて

0

私はあなたがあなたのレイアウトを移動する方法があまりにもわからないんだけど、あなたのレイアウトの中心はあなたの指の真ん中にあるようにあなたがそれを作りたいと思った場合、あなたが

params.TopMargin -= (int) event.getRawY() - (v.getHeight()/2) 
params.LeftMargin -= (int) event.getRawX() - (v.getWidth()/2) 
に必要があると思います

また、私はあなたのonTouchメソッドのように、ドラッグonTouchListenerを処理すると言うでしょう。

あなたACTION_DOWNケースにRelativeLayout DragLayerを作成し、

このhere(アンドロイドドキュメント)を行う方法でいくつかの良い例がありますあなたのACTION_MOVEの場合には、レイヤを処理し、here(サードパーティの一例)

関連する問題