7

四角形を作成しようとしていますが、開始座標から終了座標に向かって移動するとこうなります

何が起こるか

、実際には、ユーザーがあるポイントから別のポイントに移動したときの進行状況も表示したいと考えています。これが私が望んでいるものです。私はを頂きたい.

コード:-

public boolean onTouch(View v, MotionEvent event) {

    int action = event.getAction();
    switch (action) {
    case MotionEvent.ACTION_DOWN:
        downx = event.getX();
        downy = event.getY();

    //v.invalidate();
        break;
    case MotionEvent.ACTION_MOVE:
        upx = event.getX();
        upy = event.getY();

         canvas.drawRect(downx, downy, upx, upy, paint);

         }
        choosenImageView.invalidate();
        break;
    case MotionEvent.ACTION_UP:
        upx = event.getX();
        upy = event.getY();
            canvas.drawRect(downx, downy, upx, upy, paint);
            }
        } 

        // v.invalidate();
        break;
    }
    return true;
}

編集私がやりたいことは、進行状況を表示することです。つまり、ユーザーが指を動かすと、形状が描画されます。

提案/サンプル/リンクは何でも歓迎されます.

4

6 に答える 6

9

onTouch()最初にクリアせずに、イベントでキャンバスを直接更新しています。これは、ビューで何かを描画する想定された方法ではありません (これが必要な場合)。

代わりに、長方形の開始座標と現在の座標を保存し、onDraw()イベントでそれらを使用して実際の長方形を描画することになっています (Adnroid がキャンバスの無効な部分をクリアした後)。キャンバスを再描画する必要がある場合、Android はこのイベントを発行するため、次のメソッドonTouch()を使用して、イベントでこれが必要であることを伝える必要があります。invalidate()

class myView extends View { // or some other View-based class
   boolean drawRectangle = false;
   PointF beginCoordinate;
   PointF endCoordinate;

   public boolean onTouch(View v, MotionEvent event) {
      switch(event.getAction()) {
         case MotionEvent.ACTION_DOWN:
            drawRectangle = true; // Start drawing the rectangle
            beginCoordinate.x = event.getX();
            beginCoordinate.y = event.getY();
            endCoordinate.x = event.getX();
            endCoordinate.y = event.getY();
            invalidate(); // Tell View that the canvas needs to be redrawn
            break;
         case MotionEvent.ACTION_MOVE:
            endCoordinate.x = event.getX();
            endCoordinate.y = event.getY();
            invalidate(); // Tell View that the canvas needs to be redrawn
            break;
         case MotionEvent.ACTION_UP:
            // Do something with the beginCoordinate and endCoordinate, like creating the 'final' object
            drawRectangle = false; // Stop drawing the rectangle
            invalidate(); // Tell View that the canvas needs to be redrawn
            break;
      }
      return true;
   }

   protected void onDraw(Canvas canvas) {
      if(drawRectangle) {
         // Note: I assume you have the paint object defined in your class
         canvas.drawRect(beginCoordinate.x, beginCoordinate.y, endCoordinate.x, endCoordinate.y, paint);
      }
   }
}
于 2012-12-21T09:48:19.257 に答える
6

2 つの長方形の間のキャンバスをきれいにしますか? 次のような関数を追加します。

 void clearCanvas()
  {
     canvas.drawRect(0,0, width, height, paint);

  }
于 2012-12-30T15:08:13.457 に答える
3

申し訳ありませんが、私が使用し、キャンバスに四角形を描画する全体のアクティビティ魔女を提供します。

public class CanvasExample extends Activity 
    {
        /** Called when the activity is first created. */

        RelativeLayout relMainOperationLayout;
        RelativeLayout relTabHeader;
        //RelativeLayout relMidalLayout;
        RelativeLayout relBelowLayout;
        Context myContext;
        DrawCanvas drawCanvas;
        static boolean loadFlage=true;
        BibleHelper bibleHelper;

         Bitmap mainBitmap;




        @Override
        public void onCreate(Bundle savedInstanceState) 
        {
            super.onCreate(savedInstanceState);
            myContext=CanvasExample.this;
            bibleHelper=new BibleHelper(CanvasExample.this,myContext);
            bibleHelper.setFullScreen();

            LayoutInflater layoutInflater=(LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);   

            int layoutId = myContext.getResources().getIdentifier("main","layout",getPackageName());

            relMainOperationLayout = (RelativeLayout) layoutInflater.inflate(layoutId,null);

            relTabHeader=(RelativeLayout) relMainOperationLayout.findViewById(R.id.relHeadLayout);

            //relMidalLayout=(RelativeLayout) relMainOperationLayout.findViewById(R.id.relmidalLayout);

            relBelowLayout=(RelativeLayout) relMainOperationLayout.findViewById(R.id.relBelowLayout);



            mainBitmap=getIconDrawable(R.drawable.splash);


            drawCanvas=new DrawCanvas(CanvasExample.this,myContext);

            //drawCanvas.setBackgroundColor(Color.YELLOW);

            //drawCanvas.setBackgroundDrawable(CanvasExample.this.getResources().getDrawable(R.drawable.splash));

            drawCanvas.setBackgroundDrawable(new BitmapDrawable(mainBitmap));



            RelativeLayout.LayoutParams drawParams=new RelativeLayout.LayoutParams(LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT);

            drawParams.addRule(RelativeLayout.BELOW, relTabHeader.getId());

            //relMidalLayout.addView(drawCanvas,drawParams);

            relMainOperationLayout.addView(drawCanvas,drawParams);


//          mainImageView=new ImageView(CanvasExample.this);
//          
//          RelativeLayout.LayoutParams mainParams=new RelativeLayout.LayoutParams(LayoutParams.FILL_PARENT,200);
//          relMainOperationLayout.addView(mainImageView,mainParams);
//          mainImageView.setBackgroundDrawable(CanvasExample.this.getResources().getDrawable(R.drawable.ic_launcher));





            setContentView(relMainOperationLayout);



        }




        class DrawCanvas extends View
        {

            Context drawContext;
            Activity drawActivity;
            ImageView image;
            Paint mPaint;
            int left=0,right=0,top=0,bottom=0;
            Canvas passCanvas;

            //Bitmap bitmapOrg;
            // bitmapOrg;

            public DrawCanvas(Activity activity,Context context)
            {
                super(activity);

                this.drawActivity=activity;

                this.drawContext=context;

                //bitmapOrg = BitmapFactory.decodeResource(getResources(),R.drawable.splash);

                    mPaint = new Paint();

                    mPaint.setDither(true);

                    mPaint.setColor(Color.RED);

                    mPaint.setStyle(Paint.Style.STROKE);

                    mPaint.setStrokeJoin(Paint.Join.ROUND);

                    mPaint.setStrokeCap(Paint.Cap.ROUND);

                    mPaint.setStrokeWidth(3);

                    mPaint.setFilterBitmap(true);

                this.setOnTouchListener(new View.OnTouchListener() {

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

                        switch (event.getActionMasked()) 
                        {
                        case MotionEvent.ACTION_DOWN:

                            invalidate();

                            left=(int) event.getX();
                            right=left+1;
                            top=(int) event.getY();
                            bottom=top+1;               
                            mPaint.setColor(Color.BLACK);
                            onDraw(passCanvas=new Canvas());
                        break;

                        case MotionEvent.ACTION_MOVE:                   
                            invalidate();
                            int tempX=(int) event.getX();

                            //System.err.println("Get X->"+event.getX());
                            if(tempX>right)
                            {
                                right=right+1;
                            }
                            else
                            {
                                right=right-1;

                            }
                            //System.err.println("Get Y->"+event.getY());
                            int tempY=(int) event.getY();

                            if(tempY>bottom)
                            {
                                bottom=bottom+1;                

                            }else
                            {
                                bottom=bottom-1;                

                            }

                            mPaint.setColor(Color.GREEN);
                            onDraw(passCanvas=new Canvas());
                        break;

                        case MotionEvent.ACTION_UP:
                            invalidate();
                            mPaint.setColor(Color.RED);
                            onDraw(passCanvas=new Canvas());
                            System.err.println("After Touch Up");
                            CanvasExample.loadFlage=false;
                            onDraw(passCanvas=new Canvas());


                            /*
                            bibleHelper.showErrorLog("Start X -->"+left);

                            bibleHelper.showErrorLog("Real  X -->"+event.getX());

                            bibleHelper.showErrorLog("End X-->"+right);

                            bibleHelper.showErrorLog("Start Y-->"+top);

                            bibleHelper.showErrorLog("Real Y-->"+top);


                            bibleHelper.showErrorLog("End Y-->"+bottom);
                            */

                            Bitmap croppedBmp = Bitmap.createBitmap(mainBitmap,left,top,right,bottom);


                            final Dialog dialog = new Dialog(CanvasExample.this);

                            dialog.setContentView(R.layout.custom_dialog);
                            dialog.setTitle("Title...");
                            dialog.setCancelable(true);

                            ImageView image = (ImageView) dialog.findViewById(R.id.main);
                            image.setImageBitmap(croppedBmp);
                            Button btnClose=(Button) dialog.findViewById(R.id.btnClose);

                            btnClose.setOnClickListener(new View.OnClickListener() 
                            {

                                public void onClick(View v) 
                                {
                                    dialog.dismiss();
                                }
                            });

                            dialog.show();

                        break;

                        default:

                            break;
                        }
                        return true;
                    }
                });     

            }

            @Override
            protected void onDraw(Canvas canvas) 
            {

                canvas.drawRect(left, top, right, bottom, mPaint);
            }

        }
        private Bitmap getIconDrawable(int imageId)
        {
            //Drawable rtnDrawable = null;
            Bitmap imageBitmap=null;
            try 
            {
                int getImageWH[];
                imageBitmap = BitmapFactory.decodeResource(getResources(),imageId);
                int IW = imageBitmap.getWidth();
                int IH = imageBitmap.getHeight();

                bibleHelper.showErrorLog("Icon Width->" + IW);
                bibleHelper.showErrorLog("Icon Height->" + IH);

                WindowManager winManager = (WindowManager) CanvasExample.this.getSystemService(Context.WINDOW_SERVICE);
                int screenwidth = winManager.getDefaultDisplay().getWidth();
                int screenheight = winManager.getDefaultDisplay().getHeight();  

                getImageWH = bibleHelper.getObjectWidthHeight(screenwidth,screenheight, IW, IH);

                bibleHelper.showErrorLog("Get Icon Width->" + getImageWH[0]);
                 bibleHelper.showErrorLog("Get Icon Height->" + getImageWH[1]);

                imageBitmap = Bitmap.createScaledBitmap(imageBitmap, getImageWH[0],getImageWH[1], false);

                bibleHelper.showErrorLog("New Width-->"+imageBitmap.getWidth());
                bibleHelper.showErrorLog("New Height-->"+imageBitmap.getHeight());

                //rtnDrawable = (Drawable) new BitmapDrawable(imageBitmap);
            } catch (Exception ex) {
                bibleHelper.showErrorLog("Convert Icon Exception-->"+ ex.toString());
            }
            //return rtnDrawable;
            return imageBitmap;
        }


}

この BibleHelper は、メッセージとログを表示するために使用する Helper クラスです。

于 2013-01-04T04:29:11.723 に答える
3
case MotionEvent.ACTION_MOVE:
   upx = event.getX();
   upy = event.getY();

   canvas.drawRect(downx, downy, upx, upy, paint);

   }
   choosenImageView.invalidate();
break;

このコードが原因です。ここで多くの長方形を作成しているためです。代わりに、onDraw(Canvas canvas)drawRect メソッドを使用し、すべてのイベントで無効化を使用します。お役に立てれば。

于 2012-12-21T09:48:00.557 に答える
2

あなたが正しいことを理解していれば、ユーザーに画面に長方形を描いてもらい、それをディスプレイに描くでしょう。

ユーザーにフィードバックを与えるために、ユーザーが押したポイントをペイントするだけでよいと思います。ユーザーが描画を終了したら、長方形に置き換えます。

または、長方形の線を描くので、ユーザーが描画を開始すると、最初から指まで線ができます.あなたは4本の線として長方形を描いています

于 2013-01-03T18:18:39.473 に答える