Java 为什么自定义ImageView的onClickListener未注册?

Java 为什么自定义ImageView的onClickListener未注册?,java,android,imageview,zooming,onclicklistener,Java,Android,Imageview,Zooming,Onclicklistener,我有一个平移缩放相对布局,在其中我添加了25个代表星图上系统的图像视图。这占据了屏幕的2/3。另1/3显示单击相应系统imageview时的信息。但是,我的onClickListener方法没有触发。我使用了调试模式,在onClick方法的开始附近有一个断点,以确保它没有触发,而不仅仅是显示不正确。这是相关代码 public class StarMapActivity extends AppCompatActivity implements View.OnClickListener { Inte

我有一个平移缩放相对布局,在其中我添加了25个代表星图上系统的图像视图。这占据了屏幕的2/3。另1/3显示单击相应系统imageview时的信息。但是,我的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;
    }
}
我尝试过使用setOnClickListener(StarMapActivity.this) 我还尝试将StarSystemView的布局参数设置为12和12,而不是包装内容。 当我在某个地方读到交互式视图时,我还将其设置为可聚焦。 我还仔细查看了Android开发者网站,看看是否有输入错误或编码错误

开始怀疑可缩放布局内的图像视图是否根本不可浏览。
提前感谢您的帮助。

更新: 您仅在画布的绘图中缩放布局,而不是移动和缩放其中的实际视图。因此,在缩放视图时,您将无法单击,因为视图不在绘制视图的位置。您将不得不以不同的方式进行缩放,您可能应该发布一个新问题,以获得如何进行缩放的建议。

更新:
您仅在画布的绘图中缩放布局,而不是移动和缩放其中的实际视图。因此,在缩放视图时,您将无法单击,因为视图不在绘制视图的位置。您必须以不同的方式进行缩放,您可能应该发布一个新的问题,以获取如何缩放的建议。

由于可缩放的imageView,您可能需要使用onInterceptTouchEvent方法。imageView本身不可缩放。它是可缩放布局的子级。我不知道这是否有区别。由于可缩放的imageView,您可能需要使用onInterceptTouchEvent方法。imageView本身不可缩放。它是可缩放布局的子级。我不知道这是否有区别。我假设您指的是InteractiveView中的OnTouchListener。我将其设置为返回false,收缩缩放和拖动平移停止工作,但ImageView仍然不会触发活动的OnClick。因此,请发布更多代码,在其中设置OnClick侦听器和in-touch侦听器。InteractiveView代码的onTouchListener(上面的第二个块)在其构造函数中设置。自定义ImageView的onClickListener在StarMapActivity代码的plotSystem方法中设置(上面的第一个块)在将视图添加到InteractiveView之前。响应您的更新:plotSystem方法将StarSystem对象作为参数,并且每个对象都具有不同的坐标.x和坐标.y,因此它们不会放置在布局中的同一位置。(需要注意的是,星图确实可以正常工作、缩放和平移,图像正确地分散在星图上。)然而,在测试您关于图像没有在可点击位置绘制的观点时,注释画布缩放和翻译代码使我意识到这确实是个问题。那么,如何解决这个问题呢?也许我应该把它变成另一个单独的问题。另外,我很乐意接受#4作为正确答案。我假设您指的是InteractiveView中的OnTouchListener。我将其设置为返回false,收缩缩放和拖动平移停止工作,但ImageView仍然不会触发活动的OnClick。因此,请发布更多代码,在其中设置OnClick侦听器和in-touch侦听器。InteractiveView代码的onTouchListener(上面的第二个块)在其构造函数中设置。自定义ImageView的onClickListener在StarMapActivity代码的plotSystem方法中设置(上面的第一个块)在将视图添加到InteractiveView之前。响应您的更新:plotSystem方法将StarSystem对象作为参数,并且每个对象都具有不同的坐标.x和坐标.y,因此它们不会放置在布局中的同一位置。(需要注意的是,星图确实可以正常工作、缩放和平移,图像正确地分散在星图上。)然而,在测试您关于图像没有在可点击位置绘制的观点时,注释画布缩放和翻译代码使我意识到这确实是个问题。那么,如何解决这个问题呢?也许我应该把它变成另一个单独的问题。另外,我很乐意接受4作为正确答案。
    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);
    }
}
public class StarSystemView extends ImageView {

String systemName;
int systemArrayId;

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