簡體   English   中英

為什么我的自定義ImageView的onClickListener沒有注冊?

[英]Why is the onClickListener for my custom ImageView not registering?

我有一個平移縮放相對布局,在其中我添加了25個代表星圖上系統的圖像視圖。 這占據了屏幕的2/3。 另外1/3顯示有關單擊任何相應系統圖像視圖的信息。 但是,我的onClickListener方法沒有觸發。 我使用了調試模式,在onClick方法的開頭附近有一個斷點,以確保它沒有觸發,而不僅僅是顯示不正確。 這是相關的代碼。

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開發者網站,看看我是否無法弄清楚我是否犯了任何拼寫錯誤或編碼錯誤。

開始懷疑可縮放布局內的圖像視圖是否完全無法點擊。
在此先感謝您的幫助。

更新:您只是在畫布的繪制中縮放布局,而不是通過移動和縮放其中的實際視圖。 因此,在縮放它們的那一刻,您將無法單擊,因為視圖不在其被繪制的位置。 你將不得不以不同的方式進行擴展,你應該發布一個新的問題,以獲得有關如何的建議。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM