Android: как нарисовать простую графику на большом холсте с прокруткой - PullRequest
1 голос
/ 27 июня 2011

В Android мне нужно иметь возможность рисовать простую графику (точки, линии, круги, текст) на большом прокручиваемом холсте (т. Е. Экран телефона является областью просмотра в гораздо большей области). Я искал учебники о том, как сделать это без успеха.

«Карта мира БЕСПЛАТНО» на рынке Android - хороший пример того эффекта, которого мне нужно достичь.

Это должно быть распространенная проблема, поэтому я удивлен, что не могу найти примеры.

Ответы [ 2 ]

2 голосов
/ 27 июня 2011

Мне недавно пришлось реализовать что-то подобное.По сути, в моем пользовательском представлении были координаты, которые смещались бы в том месте, где объекты должны быть нарисованы, с помощью некоторых вспомогательных функций:

public class BoardView extends View {

    //coordinates to shift the view by
    public float shiftX=0f;
    public float shiftY=0f;

    //used in the dragging code
    public float lastX=-1f;
    public float lastY=-1f;

    /*...*/

    //functions that take into account the shifted x and y values
    //pretty straightforward
    final public void drawLine(Canvas c,float x1,float y1,float x2,float y2,Paint p){
        c.drawLine(x1+shiftX, y1+shiftY, x2+shiftX, y2+shiftY, p);
    }

    final public void drawText(Canvas c,String s,int x,int y,Paint p){
        c.drawText(s, x+shiftX, y+shiftY, p);
    }

    /*etc*/

Чтобы фактически реализовать перетаскивание, я написал собственный метод onTouchEvent для реализации перетаскивания:

public boolean onTouchEvent(MotionEvent event){
        int eventaction=event.getAction();
        float x=event.getX();
        float y=event.getY();
        switch(eventaction){
        case MotionEvent.ACTION_DOWN:
            time=System.currentTimeMillis();//used in the ACTION_UP case
            break;
        case MotionEvent.ACTION_MOVE:
            if(lastX==-1){ lastX=x;lastY=y;}//initializing X, Y movement
            else{//moving by the delta
                if(Math.abs(x-lastX)>1 || Math.abs(y-lastY)>1){//this prevents jittery movement I experienced
                    shiftX+=(x-lastX);//moves the shifting variables
                    shiftY+=(y-lastY);//in the direction of the finger movement
                    lastX=x;//used to calculate the movement delta
                    lastY=y;
                    invalidate();//DON'T FORGET TO CALL THIS! this redraws the view
                }
            }
            break;
        case MotionEvent.ACTION_UP: //this segment is to see whether a press is a selection click(quick press)
        //or a drag(long press)
            lastX=-1;
            if(System.currentTimeMillis()-time)<100)
                try {
                    onClickEvent(x,y);//custom function to deal with selections
                } catch (Exception e) {
                    e.printStackTrace();
                }
            break;
        }
        return true;
    }
0 голосов
/ 27 июня 2011

Посмотрите на движки плиток, о них можно найти в Google.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...