1

私は描画アプリに取り組んでおり、ユーザーが画像をインポートしてさらに描画できるようにしています。描画領域よりも大きい画像は、最大画面幅または画面高さに合わせて縮小されます。

インポートされた画像は、次を使用して drawingView の中央に配置されます canvas.drawBitmap(bitmap, x_adjustment, y_adjustment, paintScreen);

このようにして、インポートされた画像の左、右、または上、下に空白スペースができます。調整は (0,0) からカウントされます

x_adjustmenty_adjustment

コーディング:

onDraw

   @Override
   protected void onDraw(Canvas canvas)   
   {
       canvas.drawBitmap(bitmap, x_adjustment, y_adjustment, paintScreen); 

      for (Integer key : pathMap.keySet()) 
         canvas.drawPath(pathMap.get(key), paintLine); // draw line
   } 

タッチ開始:

   private void touchStarted(float x, float y, int lineID) 
   {      
      Path path; // used to store the path for the given touch id
      Point point; // used to store the last point in path

         path = new Path(); // create a new Path
         pathMap.put(lineID, path); // add the Path to Map
         point = new Point();
         previousPointMap.put(lineID, point);

      path.moveTo(x, y);
      point.x = (int) x;  
      point.y = (int) y;         
   } 

touchMoved:

   // called when the user drags along the screen
   private void touchMoved(MotionEvent event) 
   {
      // for each of the pointers in the given MotionEvent
      for (int i = 0; i < event.getPointerCount(); i++) 
      {
         // get the pointer ID and pointer index
         int pointerID = event.getPointerId(i);
         int pointerIndex = event.findPointerIndex(pointerID);

         if (pathMap.containsKey(pointerID)) 
         {
            // get the new coordinates for the pointer
            float newX = event.getX(pointerIndex);
            float newY = event.getY(pointerIndex);

            // get the Path and previous Point associated with this pointer
            Path path = pathMap.get(pointerID);
            Point point = previousPointMap.get(pointerID);

            float deltaX = Math.abs(newX - point.x);
            float deltaY = Math.abs(newY - point.y);

            if (deltaX >= TOUCH_TOLERANCE || deltaY >= TOUCH_TOLERANCE) 
            {
               path.quadTo(point.x, point.y, ((newX + point.x)/2),((newY + point.y)/2));

               // store the new coordinates
               point.x = (int) newX ;
               point.y = (int) newY ;                   
            }
         } 
      }          
   } 

タッチ終了:

   private void touchEnded(int lineID)
   {
      Path path = pathMap.get(lineID); 
      bitmapCanvas.drawPath(path, paintLine); 
      path.reset();               
   }

質問:

インポートされた画像は中央に配置されますが (0,0) ではなく、描画されるすべての線に対して配置されるため、描画および画面タッチ時に適切に表示されている場合、ユーザーが指を離すと、つまりタッチが終了すると、確定した線x_adjustment と y_adjustment によってシフトされます。

たとえば、拡大縮小された画像の幅が画面の幅よりも小さい場合、左右に空白があり、線を引くと正しく表示されますが、指を離すと線が誤ってすぐに右に移動しx_adjustmentます。

エラーを起こす調整が原因であることはわかっています。パスの座標をax、yシフトで保存することだと知っています。しかし、コードを変更する方法がわからず、パスに調整を加えようとしましたが、それでも失敗します。どなたか親切にガイドを教えていただけませんか? どうもありがとう!

4

0 に答える 0