2012-09-14 78 views
3

我是新來的android開發,對不起,如果我問一些愚蠢的問題,請嘗試幫助我。我正在嘗試實現縮放並捏合在RelativeLayout中。我想創建自己的地圖視圖,在其中獲取地圖的圖像並在其上繪製引腳(ImageVIew)。我試過了,但我目前無法點擊這些針腳。我已經做了代碼這些職位的幫助縮放和捏合RelativeLayout

Extending RelativeLayout, and overriding dispatchDraw() to create a zoomable ViewGroup

Android - zoom in/out RelativeLayout with spread/pinch

我的代碼是

public class TempView extends RelativeLayout { 
private static final int INVALID_POINTER_ID = -1; 

private Drawable mIcon; 
private float mPosX; 
private float mPosY; 
TempView temp; 
private float mLastTouchX; 
private float mLastTouchY; 
private int mActivePointerId = INVALID_POINTER_ID; 

private ScaleGestureDetector mScaleDetector; 
private float mScaleFactor = 1.f; 

public TempView(Context context) { 
    this(context, null, 0); 
    temp = this; 
} 

public TempView(Context context, AttributeSet attrs) { 
    this(context, attrs, 0); 
    temp = this; 
} 

public TempView(Context context, AttributeSet attrs, int defStyle) { 
    super(context, attrs, defStyle); 
    mIcon = context.getResources().getDrawable(R.drawable.ic_launcher); 
    mIcon.setBounds(0, 0, mIcon.getIntrinsicWidth(), mIcon.getIntrinsicHeight()); 
    temp = this; 
    mScaleDetector = new ScaleGestureDetector(context, new ScaleListener()); 
} 

@Override 
public boolean onTouchEvent(MotionEvent ev) { 
    // Let the ScaleGestureDetector inspect all events. 

    mScaleDetector.onTouchEvent(ev); 



    final int action = ev.getAction(); 
    switch (action & MotionEvent.ACTION_MASK) { 
    case MotionEvent.ACTION_DOWN: { 
     final float x = ev.getX(); 
     final float y = ev.getY(); 

     mLastTouchX = x; 
     mLastTouchY = y; 
     mActivePointerId = ev.getPointerId(0); 
     break; 
    } 

    case MotionEvent.ACTION_MOVE: { 
     final int pointerIndex = ev.findPointerIndex(mActivePointerId); 
     final float x = ev.getX(pointerIndex); 
     final float y = ev.getY(pointerIndex); 

     // Only move if the ScaleGestureDetector isn't processing a gesture. 
     if (!mScaleDetector.isInProgress()) { 
      final float dx = x - mLastTouchX; 
      final float dy = y - mLastTouchY; 

      mPosX += dx; 
      mPosY += dy; 

      invalidate(); 
     } 

     mLastTouchX = x; 
     mLastTouchY = y; 

     break; 
    } 

    case MotionEvent.ACTION_UP: { 
     mActivePointerId = INVALID_POINTER_ID; 

     break; 
    } 

    case MotionEvent.ACTION_CANCEL: { 
     mActivePointerId = INVALID_POINTER_ID; 
     break; 
    } 

    case MotionEvent.ACTION_POINTER_UP: { 
     final int pointerIndex = (ev.getAction() & MotionEvent.ACTION_POINTER_INDEX_MASK) 
       >> MotionEvent.ACTION_POINTER_INDEX_SHIFT; 
     final int pointerId = ev.getPointerId(pointerIndex); 
     if (pointerId == mActivePointerId) { 
      // This was our active pointer going up. Choose a new 
      // active pointer and adjust accordingly. 
      final int newPointerIndex = pointerIndex == 0 ? 1 : 0; 
      mLastTouchX = ev.getX(newPointerIndex); 
      mLastTouchY = ev.getY(newPointerIndex); 
      mActivePointerId = ev.getPointerId(newPointerIndex); 
     } 


     break; 
    } 
    } 
    return true; 
} 

@Override 
protected void onLayout(boolean changed, int l, int t, int r, int b) 
{ 
    int count = getChildCount(); 
    Log.d("onLayout", ""+count); 
    for(int i=0;i<count;i++){ 
     View child = getChildAt(i); 
     if(child.getVisibility()!=GONE){ 
      RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams)child.getLayoutParams(); 
      child.layout(
       (int)(params.leftMargin * mScaleFactor), 
       (int)(params.topMargin * mScaleFactor), 
       (int)((params.leftMargin + child.getMeasuredWidth()) * mScaleFactor), 
       (int)((params.topMargin + child.getMeasuredHeight()) * mScaleFactor) 
       ); 


       child.setLayoutParams(params); 
     } 
    } 
} 




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

    canvas.save(Canvas.MATRIX_SAVE_FLAG); 
    canvas.translate(mPosX, mPosY); 
    canvas.scale(mScaleFactor, mScaleFactor); 
    Log.d("onDraw", ""+mScaleFactor); 
    int count = getChildCount(); 
    for(int i=0;i<count;i++){ 
     View child = getChildAt(i); 
     if(child.getVisibility()!=GONE){ 
      child.draw(canvas); 
      Log.d("onDraw", ""+mScaleFactor); 
     } 
    } 

    canvas.restore(); 
} 
@Override 
protected void dispatchDraw(Canvas canvas) { 
    canvas.save(Canvas.MATRIX_SAVE_FLAG); 

    canvas.translate(mPosX, mPosY); 
    canvas.scale(mScaleFactor, mScaleFactor); 

    super.dispatchDraw(canvas); 
    canvas.restore(); 
} 

private class ScaleListener extends ScaleGestureDetector.SimpleOnScaleGestureListener { 
    @Override 
    public boolean onScale(ScaleGestureDetector detector) { 
     mScaleFactor *= detector.getScaleFactor(); 

     // Don't let the object get too small or too large. 
     mScaleFactor = Math.max(1.0f, Math.min(mScaleFactor, 5.0f)); 
     // Log.d("onScale", ""+mScaleFactor); 
     temp.invalidate(); 
     invalidate(); 
     return true; 
    } 
} 
} 

問題:

  • 如何僅製作樓層地圖圖像進行縮放?
  • 保持引腳無縮放但相對移動?
  • 得到準確的Click事件針

任何建議和解答會很大大appriciated上點擊時!

由於提前,

卡馬爾

+0

你有沒有發現任何解決方案提供的回調。我有同樣的問題 –

+0

@DeepakSwami我已經實施了一個解決方案和應用程序推出,請參閱https://play.google.com/store/apps/details?id=com.hyperin.app&feature=search_result#?t=W251bGwsMSwyLDEsImNvbS5oeXBlcmluLmFwcCJd – QAMAR

+3

您可以將您的解決方案作爲答案發布嗎? – Raymen

回答

0

在Android查看HTML地圖狀元件的一種實現:

  • 支持在佈局圖像作爲可拉伸或位圖
  • 允許xml中的區域標籤列表
  • 允許使用將HTML區域標籤剪切並粘貼到資源xml(即獲取HTML地圖的能力 - 以及圖像,並以最少的編輯使用它)
  • 支架平移如果圖像是比裝置屏幕
  • 較大支持捏變焦
  • 支持回調時的區域被分接。
  • 支持顯示註解文字泡沫,如果泡沫被竊聽

看到這個鏈接,你會得到你的解決方案https://github.com/catchthecows/AndroidImageMap