2016-08-16 5 views
1

У меня есть относительное расположение масштабирования панорамирования, в котором я добавляю 25 изображений, представляющих системы на starmap. Это занимает 2/3 экрана. В другой 1/3 отображается информация о том, какое нажатие соответствующей картинки. Однако мой метод onClickListener не запускается. Я использовал режим отладки с точкой останова в начале метода onClick, чтобы убедиться, что он не запускается, а не отображается неправильно. Вот соответствующий код.Почему onClickListener для моего пользовательского ImageView не регистрируется?

public class StarMapActivity extends AppCompatActivity implements View.OnClickListener { 
InteractiveView starMap; 
TextView systemNameView; 
TextView systemFactionView; 
TextView systemCoordinatesView; 
TextView systemPlanetsNumberView; 
protected void onCreate(Bundle savedInstanceState) { 

    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_star_map); 

    starMap = (InteractiveView) findViewById(R.id.myStarMapInteractiveView); 
    systemNameView = (TextView) findViewById(R.id.systemNameView); 
    systemFactionView = (TextView) findViewById(R.id.systemFactionView); 
    systemCoordinatesView = (TextView) findViewById(R.id.systemCoordinatesView); 
    systemPlanetsNumberView = (TextView) findViewById(R.id.systemPlanetsNumberView); 

for (int i = 0; i < 25; i++) {   plotSystem(PlayerCharacterInfo.currentPlayerCharacter.occupiedSector.starSystems[i], i); 
    } 
} 
void plotSystem(StarSystem systemToDraw, int systemArrayId){ //draws the white circle images that represent the systems on the map 
    StarSystemView viewToDraw = new StarSystemView(this, getResources().getString(systemToDraw.nameId), systemArrayId); 

    RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT); 


    ShapeDrawable myShape = new ShapeDrawable(new OvalShape()); 

    myShape.setIntrinsicHeight(10); 
    myShape.setIntrinsicWidth(10); 
    myShape.getPaint().setColor(-1); 

    layoutParams.leftMargin = (systemToDraw.coordinates.x - 50) * 4; 
    layoutParams.topMargin = (systemToDraw.coordinates.y - 50) * 4; 

    viewToDraw.setImageDrawable(myShape); 

    viewToDraw.setOnClickListener(this); 
    viewToDraw.setFocusable(true); 
    viewToDraw.setClickable(true); 

    starMap.addView(viewToDraw, layoutParams); 
    viewToDraw.bringToFront(); 
} 
public void onClick(View view){ 
StarSystemView clickedView = (StarSystemView) view; 
    StarSystem systemToView = PlayerCharacterInfo.currentPlayerCharacter.occupiedSector.starSystems[clickedView.systemArrayId]; 

    systemNameView.setText(getResources().getString(systemToView.nameId)); 

    switch(systemToView.systemFactionId){ 
     case 0: 
      systemFactionView.setText(getResources().getString(R.string.faction_neutral)); 
      break; 
     case 1: 
      systemFactionView.setText(getResources().getString(R.string.faction_imperial)); 
      break; 
     case 2: 
      systemFactionView.setText(getResources().getString(R.string.faction_federation)); 
      break; 
     case 3: 
      systemFactionView.setText(getResources().getString(R.string.faction_republic)); 
      break; 
    } 

    systemCoordinatesView.setText(Integer.toString(systemToView.coordinates.x)+", "+Integer.toString(systemToView.coordinates.y)); 

    switch(systemToView.numberOfPlanets){ 
     case 1: 
      systemPlanetsNumberView.setText(getResources().getString(R.string.basic_one)); 
      break; 
     case 2: 
      systemPlanetsNumberView.setText(getResources().getString(R.string.basic_two)); 
      break; 
     case 3: 
      systemPlanetsNumberView.setText(getResources().getString(R.string.basic_three)); 
      break; 
    } 
} 

Также для справки, интерактивный класс вид:

import android.util.AttributeSet; 
    import android.widget.RelativeLayout; 
    import android.content.Context; 
    import android.graphics.Canvas; 
    import java.lang.Math; 
    import android.view.MotionEvent; 
    import android.view.View; 
    import android.widget.TextView; 



    public class InteractiveView extends RelativeLayout { 

    private float mPositionX = 0; 
    private float mPositionY = 0; 
    float mScale = 1.0f; 

    public InteractiveView(Context context) { 
     super(context); 
     this.setWillNotDraw(false); 
     this.setOnTouchListener(mTouchListener); 
    } 

    public InteractiveView(Context context, AttributeSet attrs){ 
     super(context, attrs); 
     this.setWillNotDraw(false); 
     this.setOnTouchListener(mTouchListener); 
    } 


    public void setMovingPosition(float lPositionX, float lPositionY){ 
     mPositionX += lPositionX; 
     mPositionY += lPositionY; 
    } 


    @Override 
    protected void dispatchDraw(Canvas canvas) { 
     if (mScale < 0.5){ 
      mScale = 0.5f; 
     } else if (mScale > 5){ 
      mScale = 5f; 
     } 

     canvas.save(); 
     canvas.translate(getWidth()/2, getHeight()/2); 
     canvas.translate(mPositionX*mScale, mPositionY*mScale); 
     canvas.scale(mScale, mScale); 
     super.dispatchDraw(canvas); 
     canvas.restore(); 


    } 

    // touch events 
    private final int NONE = 0; 
    private final int DRAG = 1; 
    private final int ZOOM = 2; 
    private final int CLICK = 3; 

    // pinch to zoom 
    private float mOldDist; 
    private float mNewDist; 
    private float mScaleFactor = 0.01f; 

    // position 
    private float mPreviousX; 
    private float mPreviousY; 

    int mode = NONE; 

    public OnTouchListener mTouchListener = new OnTouchListener(){ 
     public boolean onTouch(View v, MotionEvent e) { 
      float x = e.getX(); 
      float y = e.getY(); 
      switch (e.getAction()) { 
       case MotionEvent.ACTION_DOWN: // one touch: drag 
        mode = CLICK; 
        break; 
       case MotionEvent.ACTION_POINTER_2_DOWN: // two touches: zoom 
        mOldDist = spacing(e); 
        mode = ZOOM; // zoom 
        break; 
       case MotionEvent.ACTION_UP: // no mode 
        mode = NONE; 
        break; 
       case MotionEvent.ACTION_POINTER_2_UP: // no mode 
        mode = NONE; 
        break; 
       case MotionEvent.ACTION_MOVE: // rotation 
        if (e.getPointerCount() > 1 && mode == ZOOM) { 
         mNewDist = spacing(e) - mOldDist; 

         mScale += mNewDist*mScaleFactor; 
         invalidate(); 

         mOldDist = spacing(e); 

        } else if (mode == CLICK || mode == DRAG) { 
         float dx = (x - mPreviousX)/mScale; 
         float dy = (y - mPreviousY)/mScale; 

         setMovingPosition(dx, dy); 
         invalidate(); 
         mode = DRAG; 
        } 
        break; 
      } 
      mPreviousX = x; 
      mPreviousY = y; 
      return true; 
     } 
    }; 

    // finds spacing 
    private float spacing(MotionEvent event) { 
     float x = event.getX(0) - event.getX(1); 
     float y = event.getY(0) - event.getY(1); 
     return (float) Math.sqrt(x * x + y * y); 
    } 
} 

Также для справки класс ImageView

public class StarSystemView extends ImageView { 

String systemName; 
int systemArrayId; 

public StarSystemView(Context context, String systemNameToSet, int arrayIdToSet){ 
    super(context); 
    systemName = systemNameToSet; 
    systemArrayId = arrayIdToSet; 
} 
} 

Я попытался с помощью setOnClickListener (StarMapActivity.this) Я также попытался установить параметры макета для StarSystemViews на 12 и 12 вместо обертывания содержимого. Я также поместил интерактивный взгляд в режим фокусировки, когда я читал это где-то. Я также дважды проверял сайт разработчика Android, чтобы узнать, не могу ли я выяснить, были ли я опечатки или ошибки в кодировке.

Запугивание, если изображения в масштабируемом макете просто неприступны.
Заранее благодарим за любую помощь.

+0

Из-за масштабируемого imageView вам может потребоваться использовать метод onInterceptTouchEvent. –

+0

Само изображение не масштабируется. Это ребенок масштабируемой компоновки. Я не знаю, имеет ли это значение. – Shieldwall

ответ

0

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

+0

Я предполагаю, что вы имеете в виду OnTouchListener в InteractiveView. Я установил, что он возвращает false, а масштабирование и масштабирование перестали работать, но ImageViews все еще не запускают OnClick активности. – Shieldwall

+0

Итак, пожалуйста, напишите больше кода, где вы устанавливаете прослушиватель onClick и прослушиватель касания. – lionscribe

+0

OnTouchListener для кода InteractiveView (второй блок выше) установлен в его конструкторах. Функция onClickListener для пользовательского ImageViews устанавливается в методе plotSystem кода StarMapActivity (первый блок выше) до того, как представление добавлено в InteractiveView. – Shieldwall