Как сделать маркеры булавки кликабельными в Imageview

Я использую представление изображения шкалы подвыборки Дейва Моррисси. Я использую его пример Pinview (как показано здесь: https://github.com/davemorrissey/subsampling-scale-image-view/blob/master/sample/src/com/davemorrissey/labs/subscaleview/sample/extension/views/PinView.java)

Что я сделал по-другому, так это то, что я создал ArrayList растровых изображений, которые являются контактами. Но я хочу сделать каждую булавку доступной для нажатия, чтобы активировать функцию щелчка. Я знаю, что на растровые изображения нельзя нажимать. У меня есть несколько булавок на изображении карты, и я хотел бы, чтобы каждая булавка была связана с объектом.

Что было бы лучшим подходом для достижения этой цели?

Примечание. Я переопределил метод setOnClickListener внутри класса Pinview, но что происходит, так это то, что все удаленные контакты становятся связанными с одним и тем же объектом. И эта очистка 1 контакта очистит все контакты.


person Ebad Saghar    schedule 12.10.2015    source источник
comment
Вы нашли ответ?   -  person Arun Mohan    schedule 21.10.2015
comment
@ArunMohan, да, есть. Я опубликую в ближайшее время.   -  person Ebad Saghar    schedule 22.10.2015
comment
@EbadSaghar, можете ли вы поделиться частью списка растровых изображений ArrayList для нескольких контактов?   -  person Raul Bărnuțiu    schedule 02.11.2015
comment
Можете ли вы поделиться кодом Как щелкнуть маркер, добавленный в imageView?   -  person Mustanser Iqbal    schedule 28.07.2017


Ответы (1)


Модель, в которой хранится растровое изображение, pointF и имя точки:

public class CategoryPoint {
    private String category;
    private Bitmap image;
    private PointF pointF;

    public CategoryPoint(String category, Bitmap image, PointF pointF) {
        this.category = category;
        this.image = image;
        this.pointF = pointF;
    }

    // getters/setters
}

Вид выглядит так:

public class PinsView extends SubsamplingScaleImageView {
    private OnPinClickListener onPinClickListener;
    private final Paint paint = new Paint();
    private List<CategoryPoint> categoryPoints;

    public PinsView(Context context) {
        this(context, null);
    }

    public PinsView(Context context, AttributeSet attr) {
        super(context, attr);
        categoryPoints = new ArrayList<>();
        initTouchListener();
    }

    public void addCategories(List<CategoryPoint> categoryPoints) {
        this.categoryPoints = categoryPoints;
        invalidate();
    }

    public void removeCategories(List<CategoryPoint> categoryPoints) {
        this.categoryPoints.removeAll(categoryPoints);
        invalidate();
    }

    public void removeAllCategories() {
        this.categoryPoints.clear();
        invalidate();
    }

    public void setOnPinClickListener(OnPinClickListener listener) {
        onPinClickListener = listener;
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        if (!isReady()) {
            return;
        }
        paint.setAntiAlias(true);
        for (CategoryPoint categoryPoint: categoryPoints) {
            Bitmap pinIcon = categoryPoint.getImage();
            if (categoryPoint.getPointF() != null && categoryPoint.getImage() != null) {
                PointF point = sourceToViewCoord(categoryPoint.getPointF());
                float vX = point.x - (pinIcon.getWidth()/2);
                float vY = point.y - pinIcon.getHeight();
                canvas.drawBitmap(pinIcon, vX, vY, paint);
            }
        }
    }

    private void initTouchListener() {
        GestureDetector gestureDetector = new GestureDetector(getContext(), new GestureDetector.SimpleOnGestureListener() {
            @Override
            public boolean onSingleTapConfirmed(MotionEvent e) {
                if (isReady() && categoryPoints != null) {
                    PointF tappedCoordinate = new PointF(e.getX(), e.getY());
                    Bitmap clickArea = categoryPoints.get(0).getImage();
                    int clickAreaWidth = clickArea.getWidth();
                    int clickAreaHeight = clickArea.getHeight();
                    for (CategoryPoint categoryPoint : categoryPoints) {
                        PointF categoryCoordinate = sourceToViewCoord(categoryPoint.getPointF());
                        int categoryX = (int) (categoryCoordinate.x);
                        int categoryY = (int) (categoryCoordinate.y - clickAreaHeight / 2);
                        if (tappedCoordinate.x >= categoryX - clickAreaWidth / 2
                            && tappedCoordinate.x <= categoryX + clickAreaWidth / 2
                            && tappedCoordinate.y >= categoryY - clickAreaHeight / 2
                            && tappedCoordinate.y <= categoryY + clickAreaHeight / 2) {
                            onPinClickListener.onPinClick(categoryPoint);
                            break;
                        }
                    }
                }
                return true;
            }
        });
        setOnTouchListener((v, event) -> gestureDetector.onTouchEvent(event));
    }
}

Фрагмент:

pinView.setOnImageEventListener(this);
pinView.setOnPinClickListener(this);

// implementation
person Vitali    schedule 18.09.2018