0

Android でフォト エディタのサイズ変更機能を作成しています。画像に触れるたびにimageViewの角に円/点を置きたいです。その円をドラッグして画像のサイズを変更できるようにします。

私の問題は、イメージビューの 4 つのコーナーの xy 位置を取得する方法です。今のところ、左上隅を作成しています。

  ImageView edgePoints = null;

  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);        

    findViewById(R.id.imageBlue).setOnTouchListener(new MyTouchListener());
    findViewById(R.id.imgstage).setOnDragListener(new MyDragListener()); 
    edgePoints = (ImageView)findViewById(R.id.edgePoint); // the dot/circle
    edgePoints.setVisibility(View.INVISIBLE);

}   


Private final class MyTouchListener implements OnTouchListener {
    public boolean onTouch(View view, MotionEvent motionEvent) {
        if (motionEvent.getAction() == MotionEvent.ACTION_DOWN ) {
          ClipData data = ClipData.newPlainText("", "");
          DragShadowBuilder shadowBuilder = new DragShadowBuilder(view);
          view.startDrag(data, shadowBuilder, view, 0);
          view.setVisibility(View.VISIBLE);


          ViewGroup owner = (ViewGroup) view.getParent();
          if(owner.getId() == R.id.imgstage)
          {
              lastImageSelected = (ImageView) view;
              RelativeLayout.LayoutParams params1 = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT);
              params1.leftMargin = view.getLeft();
              params1.topMargin = view.getTop();
              edgePoints.setLayoutParams(params1);
               edgePoints.setVisibility(View.Visible);
          }

          return true;
        } else {
        return false;
        }
      }

    }

これは私のドラッグリスナーです

     class MyDragListener implements OnDragListener {
    @Override
      public boolean onDrag(View v, DragEvent event) {
        int action = event.getAction();
        final int X = (int) event.getX();
        final int Y = (int) event.getY();

        switch (event.getAction()) {
        case DragEvent.ACTION_DRAG_STARTED:
          break;
        case DragEvent.ACTION_DRAG_ENTERED:
          break;
        case DragEvent.ACTION_DRAG_EXITED:        
          break;
        case DragEvent.ACTION_DROP:
          View view = (View) event.getLocalState();
          ViewGroup owner = (ViewGroup) view.getParent();
          ImageView imageView = (ImageView) findViewById(R.id.imgView);
          RelativeLayout.LayoutParams params1 = new RelativeLayout.LayoutParams(imageView.getWidth()/9, imageView.getWidth()/9);
          params1.leftMargin = (int) event.getX() - ((imageView.getWidth()/9)/2);
          params1.topMargin = (int) event.getY() -((imageView.getWidth()/9)/2);


          if(owner.getId() != R.id.imgstage)
          {
              owner.removeView(view);
              RelativeLayout container = (RelativeLayout) v;
              container.addView(view,params1);
          }
          else
              view.setLayoutParams(params1);

          view.setVisibility(View.VISIBLE);


          if(owner.getId() != R.id.imgstage)
          {
              FrameLayout layout = (FrameLayout) owner;
              Context context = getApplicationContext();


              ImageView imv=new ImageView(context);
              FrameLayout.LayoutParams marginParams = new FrameLayout.LayoutParams(FrameLayout.LayoutParams.WRAP_CONTENT, FrameLayout.LayoutParams.WRAP_CONTENT);
              marginParams.setMargins(4, 4, 4, 4);
              imv.setLayoutParams(marginParams);


              imv.setOnTouchListener(new MyTouchListener());

              if(owner.getId() == R.id.blueLayout)   
                  imv.setImageResource(R.drawable.blueblock);
              if(owner.getId() == R.id.orageLayout) 
                  imv.setImageResource(R.drawable.orangeblock);
              if(owner.getId() == R.id.redLayout) 
                  imv.setImageResource(R.drawable.redblock);
              if(owner.getId() == R.id.greenLayout) 
                  imv.setImageResource(R.drawable.greenblock);

              layout.addView(imv);//to be included
          }
          break;
        case DragEvent.ACTION_DRAG_ENDED:
          default:
          break;
        }
        return true;
      }
  }
4

2 に答える 2

1

アプリがクラッシュする理由はedgePoints、レイアウトに複数回追加しようとしたためです。ビューが既に追加されている場合、ビューを追加することはできません。

解決策は、呼び出す前にビューを追加し、onTouchそれを保持することINVISIBLEです。次に、onTouch では、次のようにする必要があります。

public boolean onTouch(View view, MotionEvent motionEvent) {
    if (motionEvent.getAction() == MotionEvent.ACTION_DOWN ) {

        RelativeLayout.LayoutParams params1 = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT);
        params1.leftMargin = lastImageSelected.getLeft();
        params1.topMargin = lastImageSelected.getTop();

        edgePoints.setVisibility(View.VISIBLE);
        edgePoints.setLayoutParams(params1);
    }
}

layout params着信拒否を設定するだけaddView()

于 2013-11-05T08:00:29.923 に答える
0

フォト エディタを独自のビューで実行した方がよい場合、サイズ変更については簡単です。画像を含む四角形と端に 4 つの小さな四角形を描くだけです。独自のビューを使用する利点は次のとおりです。座標を取得して操作する方がはるかに簡単で、レイアウト パラメーターの頭痛の種になることはありません。

ここを見てください

于 2013-11-05T08:44:04.820 に答える