Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/217.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
带有OnTouchListener Android的imageView中的双事件_Android_Android Layout_Android Imageview_Ontouchlistener - Fatal编程技术网

带有OnTouchListener Android的imageView中的双事件

带有OnTouchListener Android的imageView中的双事件,android,android-layout,android-imageview,ontouchlistener,Android,Android Layout,Android Imageview,Ontouchlistener,我正在尝试使用Android2.1(sdk 2.1)构建一个拖放功能。我在网上搜索,只能用安卓4.0+找到。 我使用这段代码动态创建和设置了一个ImageView(包装在一个具有一些属性和属性的类中) public void setTileImage(Drawable tileImage) { if (tileImage == null) { Log.d("Tiles", "Null"); } this.tileImage = new ImageView(

我正在尝试使用Android2.1(sdk 2.1)构建一个拖放功能。我在网上搜索,只能用安卓4.0+找到。 我使用这段代码动态创建和设置了一个ImageView(包装在一个具有一些属性和属性的类中)

public void setTileImage(Drawable tileImage) {
    if (tileImage == null) {
        Log.d("Tiles", "Null");
    }
    this.tileImage = new ImageView(this.context);
    this.tileImage.setImageDrawable(tileImage);
    this.tileImage.setAdjustViewBounds(true);
    this.tileImage.setScaleType(ImageView.ScaleType.FIT_START);
    this.createImageMargins();
}

public void createImageMargins() {
    LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(this.imageSizeX, this.imageSizeY);
    this.tileImage.setLayoutParams(layoutParams);
    MarginLayoutParams marginParams = new MarginLayoutParams(this.tileImage.getLayoutParams());
    marginParams.setMargins(this.initialPositionX, this.initialPositionY, this.initialPositionX + imageSizeX, this.initialPositionY + this.imageSizeY);
    RelativeLayout.LayoutParams layoutParams2 = new RelativeLayout.LayoutParams(marginParams);
    this.tileImage.setLayoutParams(layoutParams2);
    this.tileImage.requestLayout();
}
我将此ImageView添加到RelativeLayout

RelativeLayout layout = (RelativeLayout) findViewById(R.id.playscreen);
Tiles t1 = this.createTitle();
layout.addView(t1.getTileImage());
对于创建的每个ImageView(有几个),我添加了OnTouchListener(对于所有视图都是唯一的)

这就是实现OnTouchListener方法的类。此类使用接收到的事件的位置更改ImageView的位置(在类之后更新边距-方法)

public class TouchListener implements OnTouchListener{

public boolean onTouch(View v, MotionEvent motionEvent) {
    Tiles currentTile = Tiles.searchTileByView(Play.getAvailableTiles(), (ImageView)v);
    if (motionEvent.getAction() == MotionEvent.ACTION_DOWN) {
        return true;
    } else if (motionEvent.getAction() == MotionEvent.ACTION_UP) {
        Tiles t = Play.checkCollision(currentTile, currentTile.getPositionX(), currentTile.getPositionY());
        if(t == null){
            if(currentTile.getPositionX() == currentTile.getInitialPositionX() && currentTile.getPositionY() == currentTile.getInitialPositionY()){
                Log.d("Log","This was a click");
            }else{
                currentTile.setPositionX(currentTile.getInitialPositionX());
                currentTile.setPositionY(currentTile.getInitialPositionY());
                currentTile.createImageMargins();
            }
        }else{
            if(t.getId() == currentTile.getId()){
                Play.updateScore(t.getPoints()*t.getSpecialPoints()+currentTile.getPoints()*currentTile.getSpecialPoints());
                t.setActive(false);
                currentTile.setActive(false);
                t.getTileImage().setVisibility(View.INVISIBLE);
                currentTile.getTileImage().setVisibility(View.INVISIBLE);
                Log.d("Log","Tile Removed");
            }
        }
        return true;
    }else if(motionEvent.getAction() == MotionEvent.ACTION_MOVE){
        Log.d("Log:" + this.toString() + ":" + v,"Moved -> X: " + motionEvent.getX() + " Y: " + motionEvent.getY());
        currentTile.setPositionX((int) motionEvent.getX());
        currentTile.setPositionY((int) motionEvent.getY());
        currentTile.updateImageMargins();
        return true;
    }else{
        return false;
    }
}

public void updateImageMargins(){
    MarginLayoutParams marginParams = new MarginLayoutParams(this.tileImage.getLayoutParams());
    marginParams.setMargins(this.positionX, this.positionY, this.positionX  + imageSizeX, this.positionY + this.imageSizeY);
    RelativeLayout.LayoutParams layoutParams2 = new RelativeLayout.LayoutParams(marginParams);
    this.tileImage.setLayoutParams(layoutParams2);
}
我想问题是我在OnTouchListener.onTouch方法中接收到两个事件。第一种方法是使用RelativeLayout的坐标(因此它从屏幕的左上角开始),另一种方法是使用ImageView的坐标(它从ImageView的左上角开始),因此当我单击并移动时,我接收到具有两个不同事件坐标的事件,如下所示:

TouchListener@44f3bf80:android.widget.ImageView@44f1b4c8 Moved -> X: 59.0 Y: 24.000015
TouchListener@44f3bf80:android.widget.ImageView@44f1b4c8 Moved -> X: 100.0 Y: 148.00002

换句话说,第一行从imageview中单击的位置接收坐标(如果我在任何边界附近单击,该值将更改),第二行是relativelayout中单击的位置。因此,当我移动光标时,图像开始从一点闪烁到另一点。当我向任何方向移动光标时,这两个值都会成比例地改变。

尝试使用
motionEvent.getRawX()
motionEvent.getRawY()
而不是
getX()
getY()
。您可能需要进行额外的调整,以便在
视图中正确对齐它

找到解决方案了吗?我也有同样的问题
TouchListener@44f3bf80:android.widget.ImageView@44f1b4c8 Moved -> X: 59.0 Y: 24.000015
TouchListener@44f3bf80:android.widget.ImageView@44f1b4c8 Moved -> X: 100.0 Y: 148.00002