Как перерисовать Android Canvas - PullRequest
0 голосов
/ 09 августа 2011

Может кто-нибудь помочь мне, как перерисовать холст.Я пробовал много примеров и исходного кода из Интернета, но он все еще не работал на моем ПК, таких как инвалиды func, canvas.save, canvas.restore и т. Д. Я хочу сделать некоторый перевод и масштабирование для canvas, но когдаЯ следую за шагом в интернете, он ничего не показывает.Это мой исходный код.(Я все еще новичок в программировании на Java / Android.)

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    requestWindowFeature(Window.FEATURE_NO_TITLE);
    drawMaps.j=1;
    resources = this.getResources();
    try {
        GetAttributes("path");
        } catch (XmlPullParserException e) {
          e.printStackTrace();
        } catch (IOException e) {
          e.printStackTrace();
        }
        SeekBar seekBar = (SeekBar)findViewById(R.id.seekBar1);
        panel = new Panel(this);
        setContentView(R.layout.main);
        panel.onDraw(canvas2);
        ImageView image = (ImageView) findViewById(R.id.mapImage);
            image.setImageBitmap(bufMaps);
}


class Panel extends View{
    Paint paint = new Paint();
    public Panel(Context context) {
        super(context);
        setFocusable(true);
    }


    public Bitmap quicky_XY(Bitmap bitmap,int pos_x,int pos_y){
        Bitmap bufMap = Bitmap.createBitmap(bitmap.getWidth(),
        bitmap.getHeight(), Config.ARGB_8888);
        Canvas canvas = new Canvas(bufMap);
        canvas.save();
            final Paint paint = new Paint();
            width = canvas.getWidth();//start
            height = canvas.getHeight();//end
            drawMaps.xpos = width / 30;
            drawMaps.ypos = height/ 20;

            paint.setStrokeWidth(0);
            for (int i = 0; i < 30; i++) {
                paint.setColor(Color.DKGRAY);
                canvas.drawLine(drawMaps.xpos +(drawMaps.xpos*i), 0, 
                    drawMaps.xpos +(drawMaps.xpos*i), height, paint);
            //canvas.drawLine(startX, startY, stopX, stopY, paint)
            } 
            for (int i = 0; i < 20; i++) {
                paint.setColor(Color.DKGRAY);
                canvas.drawLine(0, drawMaps.ypos+(drawMaps.ypos*i), 
                    width, drawMaps.ypos+(drawMaps.ypos*i), paint);
            }

            canvas.translate(pos_x,pos_y);
            drawMaps.addPath(canvas);
            canvas.restore();
            invalidate();
        return bufMap;
     }

    @Override
    public void onDraw(Canvas canvas) {
        canvas.save();
        bufMaps = Bitmap.createBitmap(mWidth, mHeight, Bitmap.Config.ARGB_8888);
        bufMaps = quicky_XY(emptyBmap,positionX,positionY);

    }

}

@Override
public boolean onTouchEvent(MotionEvent event)  
{  
 positionX = (int)event.getRawX();  
 positionY = (int)event.getRawY();  
 switch(event.getAction())  
       {  
      case MotionEvent.ACTION_DOWN: {  
            prevX = positionX;  
            prevY = positionY;  
      }  
      break;  
      case MotionEvent.ACTION_MOVE:  {  
          final int distY = Math.abs(positionY - prevY);  
          final int distX = Math.abs(positionX - prevX);    
          if (distX > mTouchSlop || distY > mTouchSlop){
                panel.getDrawingCache();
                panel.invalidate();
          }
              Log.e("LSDEBUG", "touch X, " + positionX);
      }     
      break;  
      }  
 return true;  
}

1 Ответ

1 голос
/ 27 июня 2012

Вы не вызываете onDraw () самостоятельно. Вместо этого вы вызываете invalidate (), и он удостоверится, что onDraw () вызывается, как только это возможно.

Кроме того, если вы пытаетесь рисовать на холсте извне метода onDraw (), вам нужно получить ссылку на холст.

Внутри onDraw () холст не изменяется. только сохраняется (опять же, вызывается на invalidate () или всякий раз, когда системе необходимо перерисовать это представление):

@Override
public void onDraw(Canvas canvas) {
    canvas.save();
    bufMaps = Bitmap.createBitmap(mWidth, mHeight, Bitmap.Config.ARGB_8888);
    bufMaps = quicky_XY(emptyBmap,positionX,positionY);

}

Доступ к холсту снаружи onDraw () осуществляется с помощью Holder (). LockCanvas () для получения ссылки на холст. После рисования вы снова разблокируете его, используя unlockAndPost () и все.

Вам также потребуется реализовать интерфейс Callback.surfaceCreated, чтобы узнать, когда Surface доступен для использования.

Взгляните на справочник по Android для SurfaceHolder .

Этот пост объясняет это очень хорошо.

...