Как отобразить крест на изображениях на сенсорном событии? - PullRequest
1 голос
/ 10 апреля 2011

В моем проекте есть изображение.Когда пользователь касается любого места на изображении, оно должно быть помечено крестиком.Также мы должны очистить этот крест нажатием кнопки.Мне удалось отобразить изображение.Что мне нужно сделать в функции ontouchlistener(), чтобы отобразить точку пересечения?Пожалуйста, помогите.

Ответы [ 4 ]

3 голосов
/ 10 апреля 2011

Я бы создал пользовательский ImageView, что-то вроде:

public class MarkableImageView extends ImageView {

    ArrayList<Marker> mMarkers;

    // ...

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);

        for(Marker m : mMarkers) {
            // draw the marker
        }
    }

    @Override
    public boolean onTouchEvent(MotionEvent e) {
        if (e.getAction() == MotionEvent.ACTION_DOWN) {
            mMarkers.add(new Marker(e.getX(), e.getY()));
            invalidate();
            return true;
        }
        return false;
    }

    public void reset() {
        mMarkers.clear();
        invalidate();
    }

    // this class will be visible only inside MarkableImageView
    private class Marker {
        public int x;
        public int y;
        // you might want to add other properties, for example
        // if you need to have different types of markers

        public Marker(int x, int y) {
            this.x = x;
            this.y = y;
        }
    }
}
2 голосов
/ 05 октября 2012

Этот код работает на 100%. Если у вас остались вопросы, вы можете связаться со мной.

public boolean onTouchEvent(MotionEvent event, MapView mapView) 
{   
    if (event.getAction() == 1) 
    {                
            GeoPoint p = mapView.getProjection().fromPixels(
                (int) event.getX(),
                (int) event.getY());
                Toast.makeText(getBaseContext(), "lat and longtd is \n "+
                    p.getLatitudeE6() / 1E6 + "," + 
                    p.getLongitudeE6() /1E6 , 
                    Toast.LENGTH_LONG).show(); //
               mapView.getOverlays().add(new MarkerOverlay(p));
                mapView.invalidate();
    } 

    return true;
}  

, а также определить другой (2-й) класс оверлея ... куда попадет это событие.

class MarkerOverlay extends Overlay
{
    private GeoPoint p;
    private Projection projection; 

    public MarkerOverlay(GeoPoint p)
    {
        this.p = p;
    }

    @Override
    public boolean draw(Canvas canvas, MapView mapView,boolean shadow, long when)
    {
        super.draw(canvas, mapView, shadow);                   

        //---translate the GeoPoint to screen pixels---
        Point screenPts = new Point();
        mapView.getProjection().toPixels(p, screenPts);

        //---add the marker---
        Bitmap bmp = BitmapFactory.decodeResource(getResources(),R.drawable.pir_pictr);            
        canvas.drawBitmap(bmp, screenPts.x, screenPts.y-50, null);

        return true;   
     }



 }
1 голос
/ 29 апреля 2013

Я тоже ищу решение этой проблемы.Мне нужно сделать круглую отметку на изображении, где пользователь касается.Я также собираюсь дистанционно управлять устройством с этой информацией.То, что я нашел в качестве решения, я приведу дальше.Проблема заключается в том, что экраны dpi и устройства меняются, эта операция маркировки требует калибровки.Я пытаюсь улучшить метод.Но также, может быть, это кому-нибудь пригодится.

Вот оно:

1) Метод: Сначала создайте изображение с помощью программы, такой как Gimp или photoshop (или ...).В макете разместите изображение.Поместите изображение в это изображение с оригинальным размером.(это слабое место № 1).Для onTouchEvent добавьте следующий код.Что будет делать код, это создать 2 рисованных объекта.Создайте 2 слоя.1-й слой - изображение (выше), а второй слой - метка.Затем поместите отметку там, где пользователь касается.(это слабое место № 2).

2) Код:

// On the top
public ImageView ptable;
Drawable[] layers;

Тогда

//OnCreateView
ptable = (ImageView)rootView.findViewById(R.id.img_ptable);
layers = new Drawable[2];
layers[0] = r.getDrawable(R.drawable.pratik);
layers[1] = r.getDrawable(R.drawable.pratik);
LayerDrawable ldr = new LayerDrawable(layers);
ptable.setImageDrawable(ldr);

Затем

ptable.setOnTouchListener(new OnTouchListener() {

        @Override
        public boolean onTouch(View v, MotionEvent event) {
            String text = "Click X:"+ String.valueOf(event.getX())+ " Y:" + String.valueOf(event.getY());


            //Dokunulan yere bir işaret oluştur.
            Bitmap mark = Bitmap.createBitmap(600, 400,Bitmap.Config.ARGB_8888);
            Canvas ca = new Canvas(mark);
            Paint pa = new Paint();
            pa.setStyle(Paint.Style.STROKE);
            pa.setAntiAlias(true);
            //pa.setStrokeCap(Paint.Cap.ROUND);
            pa.setStrokeWidth((float)3);
            pa.setARGB(251, 20, 20, 20);
            float cx = event.getX() + 10 + (8*event.getX()/100);
            float cy = event.getY() + 10 + (6*event.getY()/100);

            ca.drawCircle(cx, cy, 13, pa);
            BitmapDrawable bmp = new BitmapDrawable(getResources(), mark);
            layers[1] = (Drawable)bmp;
            LayerDrawable ldr = new LayerDrawable(layers);
            ptable.setImageDrawable(ldr);



            return true;
        }

    });

Этокод работает, но работает правильно только с определенным размером экрана и плотностью пикселей.Я собираюсь улучшить это.

0 голосов
/ 10 апреля 2011

Используйте 2 изображения с двумя ImageView Один без перекрестной метки скажет no_cross.png - image_view1. - Другой - с крестиком, скажем, with_cross.png - image_view2.

Поместите их в ту же позицию в XML. Первоначально видимость image_view2 (containsig with_cross.png) невидима.

android:visibilty="gone"

OnImage touch делает видимость with_cross.png видимым и no_cross.png невидимым.

setVisibility(View.GONE) для image_view1 setVisibility(View.VISIBLE) для image_view2

При нажатии кнопки сделать реверс.

setVisibility(View.VISIBLE) для image_view1 setVisibility(View.GONE) для image_view2

...