我正在進(jìn)行一個(gè)項(xiàng)目,我需要在圖像視圖上添加圖釘,如下圖所示.
我們?cè)趺茨苓@樣做
我使用成功創(chuàng)建了可縮放的圖像視圖
TouchImageview.java
class TouchImageView extends ImageView {Matrix matrix = new Matrix();// We can be in one of these 3 statesstatic final int NONE = 0;static final int DRAG = 1;static final int ZOOM = 2;int mode = NONE;// Remember some things for zoomingPointF last = new PointF();PointF start = new PointF();float minScale = 1f;float maxScale = 3f;float[] m;float redundantXSpace, redundantYSpace;float width, height;static final int CLICK = 3;float saveScale = 1f;float right, bottom, origWidth, origHeight, bmWidth, bmHeight;ScaleGestureDetector mScaleDetector;Context context;@Overrideprotected void onDraw(Canvas canvas) { super.onDraw(canvas); }public TouchImageView(Context context) { super(context); super.setClickable(true); this.context = context; mScaleDetector = new ScaleGestureDetector(context, new ScaleListener()); matrix.setTranslate(1f, 1f); m = new float[9]; setImageMatrix(matrix); setScaleType(ScaleType.MATRIX); setOnTouchListener(new OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { mScaleDetector.onTouchEvent(event); Log.e("Deepak", "X" event.getRawX()); Log.e("Deepak", "Y" event.getRawY()); matrix.getValues(m); float x = m[Matrix.MTRANS_X]; float y = m[Matrix.MTRANS_Y]; PointF curr = new PointF(event.getX(), event.getY()); switch (event.getAction()) { case MotionEvent.ACTION_DOWN: last.set(event.getX(), event.getY()); start.set(last); mode = DRAG; break; case MotionEvent.ACTION_MOVE: if (mode == DRAG) { float deltaX = curr.x - last.x; float deltaY = curr.y - last.y; float scaleWidth = Math.round(origWidth * saveScale); float scaleHeight = Math.round(origHeight * saveScale); if (scaleWidth < width) { deltaX = 0; if (y deltaY > 0) deltaY = -y; else if (y deltaY < -bottom) deltaY = -(y bottom); } else if (scaleHeight < height) { deltaY = 0; if (x deltaX > 0) deltaX = -x; else if (x deltaX < -right) deltaX = -(x right); } else { if (x deltaX > 0) deltaX = -x; else if (x deltaX < -right) deltaX = -(x right); if (y deltaY > 0) deltaY = -y; else if (y deltaY < -bottom) deltaY = -(y bottom); } matrix.postTranslate(deltaX, deltaY); last.set(curr.x, curr.y); } break; case MotionEvent.ACTION_UP: mode = NONE; int xDiff = (int) Math.abs(curr.x - start.x); int yDiff = (int) Math.abs(curr.y - start.y); if (xDiff < CLICK && yDiff < CLICK) performClick(); break; case MotionEvent.ACTION_POINTER_UP: mode = NONE; break; } setImageMatrix(matrix); invalidate(); return true; // indicate event was handled } });}@Overridepublic void setImageBitmap(Bitmap bm) { super.setImageBitmap(bm); bmWidth = bm.getWidth(); bmHeight = bm.getHeight();}public void setMaxZoom(float x){ maxScale = x;}private class ScaleListener extends ScaleGestureDetector.SimpleOnScaleGestureListener { @Override public boolean onScaleBegin(ScaleGestureDetector detector) { mode = ZOOM; return true; } @Override public boolean onScale(ScaleGestureDetector detector) { float mScaleFactor = (float)Math.min(Math.max(.95f, detector.getScaleFactor()), 1.05); float origScale = saveScale; saveScale *= mScaleFactor; if (saveScale > maxScale) { saveScale = maxScale; mScaleFactor = maxScale / origScale; } else if (saveScale < minScale) { saveScale = minScale; mScaleFactor = minScale / origScale; } right = width * saveScale - width - (2 * redundantXSpace * saveScale); bottom = height * saveScale - height - (2 * redundantYSpace * saveScale); if (origWidth * saveScale <= width || origHeight * saveScale <= height) { matrix.postScale(mScaleFactor, mScaleFactor, width / 2, height / 2); if (mScaleFactor < 1) { matrix.getValues(m); float x = m[Matrix.MTRANS_X]; float y = m[Matrix.MTRANS_Y]; if (mScaleFactor < 1) { if (Math.round(origWidth * saveScale) < width) { if (y < -bottom) matrix.postTranslate(0, -(y bottom)); else if (y > 0) matrix.postTranslate(0, -y); } else { if (x < -right) matrix.postTranslate(-(x right), 0); else if (x > 0) matrix.postTranslate(-x, 0); } } } } else { matrix.postScale(mScaleFactor, mScaleFactor, detector.getFocusX(), detector.getFocusY()); matrix.getValues(m); float x = m[Matrix.MTRANS_X]; float y = m[Matrix.MTRANS_Y]; if (mScaleFactor < 1) { if (x < -right) matrix.postTranslate(-(x right), 0); else if (x > 0) matrix.postTranslate(-x, 0); if (y < -bottom) matrix.postTranslate(0, -(y bottom)); else if (y > 0) matrix.postTranslate(0, -y); } } return true; }}@Overrideprotected void onMeasure (int widthMeasureSpec, int heightMeasureSpec){ super.onMeasure(widthMeasureSpec, heightMeasureSpec); width = MeasureSpec.getSize(widthMeasureSpec); height = MeasureSpec.getSize(heightMeasureSpec); //Fit to screen. float scale; float scaleX = (float)width / (float)bmWidth; float scaleY = (float)height / (float)bmHeight; scale = Math.min(scaleX, scaleY); matrix.setScale(scale, scale); setImageMatrix(matrix); saveScale = 1f; // Center the image redundantYSpace = (float)height - (scale * (float)bmHeight) ; redundantXSpace = (float)width - (scale * (float)bmWidth); redundantYSpace /= (float)2; redundantXSpace /= (float)2; matrix.postTranslate(redundantXSpace, redundantYSpace); origWidth = width - 2 * redundantXSpace; origHeight = height - 2 * redundantYSpace; right = width * saveScale - width - (2 * redundantXSpace * saveScale); bottom = height * saveScale - height - (2 * redundantYSpace * saveScale); setImageMatrix(matrix);}}
現(xiàn)在我需要在上面添加標(biāo)記.
任何幫助.
解決方法:
我在這里找到了答案https://github.com/catchthecows/AndroidImageMap
在Android視圖中實(shí)現(xiàn)HTML地圖的元素:
>在布局中支持圖像作為可繪制或位圖
>允許xml中的區(qū)域標(biāo)簽列表
>允許使用剪切和粘貼HTML區(qū)域標(biāo)簽到資源xml(即,獲取HTML地圖的能力 – 和圖像,并使用最少的編輯使用它)
>如果圖像大于設(shè)備屏幕,則支持平移
>支持雙指縮放
>在點(diǎn)擊區(qū)域時(shí)支持回調(diào).
>支持將注釋顯示為氣泡文本,并在點(diǎn)擊氣泡時(shí)提供回調(diào)
聯(lián)系客服