2016-11-25 11 views
-2

爲Android應用IM編碼我試圖使它所以當用戶敲擊「播放器」,這是一個圖像滑過屏幕,直到它達到x值製作圖像去哪裏用戶點擊

我試着調用此方法時,將播放器MotionEvent觸摸屏幕

public void movementUpdate(int x){ 
    if(goalX < x){ 
     goalX -= width; 
    } 
    if(goalX > x){ 
     goalX += width; 
    } 
    goalX = x; 
} 

然後在更新方法我稱之爲

public void update(){ 
    if(goalX > x) 
     x += 4; 
    if(goalX < x) 
     x -= 4; 
} 

但圖像總是過得過去,它還是不夠遠

此外,由於當您點擊圖像的前面時,圖像是從左上角用java繪製的,所以您必須減去寬度的1/2以使其停止在中間而不是邊緣,並且如果您在後面單擊減號1/2呢?

+0

簡單。設置onTouchListener或者在視圖中覆蓋onTouchEvent,設置imageview的x的圖像佈局爲touchX - imageWidth/2,Y爲相同的。 –

+0

@MuhammadBabar它似乎越過我在哪裏點擊 – Kingbluesapphire

+0

屏幕上的座標0,0左上角。然後在右下角是最大的座標。當選擇最終目的地時,應該減去正在移動的圖像視圖的寬度和高度的1/2,以便它在觸摸點的中心。 – holycatcrusher

回答

2

我做了一個基本的結構供你使用。如果粘貼代碼,您可能需要添加包名稱,更改活動名稱,更改佈局名稱,然後將名爲grey_star的png圖像添加到可繪製文件夾。

import android.os.CountDownTimer; 
import android.provider.ContactsContract; 
import android.support.v7.app.ActionBar; 
import android.support.v7.app.AppCompatActivity; 
import android.os.Bundle; 
import android.util.DisplayMetrics; 
import android.util.Log; 
import android.view.MotionEvent; 
import android.view.Window; 
import android.view.WindowManager; 
import android.widget.ImageView; 
import android.widget.TextView; 

public class MainActivity extends AppCompatActivity { 

//the vars that contains the users touch coords, I set some place holders the disapear as soon 
//as the user touches the screen 
private float touchX = 100; 
private float touchY = 100; 

//number of pixels to be moved every tick you should 
//calculate them based on the screen size in a setup method 
private int xSpeed = 10; 
private int ySpeed = 10; 

//bounds of the screen 
private int leftBound; 
private int rightBound; 
private int topBound; 
private int bottomBound; 

//screen dimensions 
private float pxScreenWidth; 
private float pxScreenHeight; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 


    //make the scree go fullscreen 
    requestWindowFeature(Window.FEATURE_NO_TITLE); 
    getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, 
      WindowManager.LayoutParams.FLAG_FULLSCREEN); 

    //remove action bar, and set content view 
    setContentView(R.layout.activity_main); 
    ActionBar actionBar = getSupportActionBar(); 
    actionBar.hide(); 

    //obtain the width and height of the screen in pixels 
    DisplayMetrics displayMetrics = getResources().getDisplayMetrics(); 
    pxScreenHeight = displayMetrics.heightPixels; 
    pxScreenWidth = displayMetrics.widthPixels; 

    //set bounds 
    leftBound = 0; 
    rightBound = (int) pxScreenWidth; 
    topBound = 0; 
    bottomBound = (int) pxScreenHeight; 


    mainGame(); 
} 

private void mainGame() { 


    //some kind of timer I am lazy and used the countdown for this example 
    //it does something every millisecond 
    //first value is number of ticks second is the size 1 = 1ms 1000=1s 
    new CountDownTimer(1000000, 1) { 

     public void onTick(long millisUntilFinished) { 

      //get the image view 
      ImageView thing = (ImageView) findViewById(R.id.thing); 
      int x = (int) thing.getX(); 
      int y = (int) thing.getY(); 


      moveThing(x, y, (int) touchX, (int) touchY); 


     } 

     public void onFinish() { 

     } 
    }.start(); 

} 

private void moveThing(int xCoord, int yCoord, int targetX, int targetY) { 

    //adjust these values to center 
    ImageView thing = (ImageView) findViewById(R.id.thing); 
    targetX = targetX - thing.getWidth()/2; 
    targetY = targetY - thing.getHeight()/2; 

    int width = thing.getWidth(); 
    int height = thing.getHeight(); 

    //for recording intended position 
    int tempX = 0; 
    int tempY = 0; 

    //check so don't run if don't have to. 
    if (xCoord != targetX) { 
     boolean lessX = false; 

     //set value to move forward 
     int x = xCoord + xSpeed; 

     //but if has to move backwards set the value to move backwards 
     if (targetX < xCoord) { 
      x = xCoord - xSpeed; 
      lessX = true; 

     } 

     //if the amount of pixes goes over the target set it to the target 
     if (lessX == false && x > targetX) { 
      x = targetX; 

     } else if (lessX == true && x < targetX) { 
      x = targetX; 

     } 

     //check x bounds 
     int temp = checkXBounds(x, width, leftBound, rightBound); 
     if(temp != -1){ 
      x = temp; 

     } 

     //draw the thing in the new location 
     if (xCoord < targetX || (xCoord > targetX && lessX == true)) { 
      thing.setX(x); 

     } 
     tempX = (int) x; 


    } 

    //check so don't run if don't have to. 
    if (yCoord != targetY) { 

     //set value to move forward 
     int y = yCoord + ySpeed; 
     boolean lessY = false; 

     //but if has to move backwards set the value to move backwards 
     if (targetY < yCoord) { 
      y = yCoord - ySpeed; 
      lessY = true; 

     } 

     //if the amount of pixes goes over the target set it to the target 
     if (y > targetY && lessY == false) { 
      y = targetY; 

     } else if (y < targetY && lessY == true) { 
      y = targetY; 

     } 

     //check y bounds 
     int temp = checkYBounds(y, topBound, bottomBound, height); 
     if(temp != -1){ 
      y = temp; 

     } 

     //draw the thing in the new location 
     if (yCoord < targetY || (yCoord > targetY && lessY == true)) { 
      thing.setY(y); 

     } 

     tempY = (int) y; 
    } 


    TextView textView = (TextView) findViewById(R.id.coords); 
    textView.setText("x: " + tempX + " " + "y: " + tempY); 

} 

private int checkXBounds(int xCoord, int width, int leftBound, int rightBound){ 

    if(checkLeftBound(xCoord, leftBound) == false){ 
     return leftBound; 

    } 
    if(checkRightBound(xCoord, rightBound, width) == false){ 
     return rightBound - width; 

    } 

    return -1; 
} 

private int checkYBounds(int yCoord, int topBound, int bottomBound, int height){ 

    if(checkTopBound(yCoord, topBound) == false){ 
     return topBound; 

    } 

    if(checkBottomBound(yCoord, bottomBound, height) == false){ 
     return bottomBound - height; 

    } 

    return -1; 
} 

private boolean checkLeftBound(int xCoord, int leftBound) { 
    if(xCoord < leftBound){ 
     return false; 

    } 

    return true; 
} 

private boolean checkRightBound(int xCoord, int rightBound, int width){ 
    if(xCoord + width > rightBound){ 
     return false; 

    } 

    return true; 
} 

private boolean checkTopBound(int yCoord, int topBound){ 
    if(yCoord < topBound){ 
     return false; 

    } 

    return true; 
} 

private boolean checkBottomBound(int yCoord, int bottomBound, int height){ 
    if(yCoord + height > bottomBound){ 
     return false; 

    } 

    return true; 
} 


//gets touch coordinates and handles moving the ship 
@Override 
public boolean onTouchEvent(MotionEvent event) { 

    //get the touch coordinates 
    touchX = event.getX(); 
    touchY = event.getY(); 


    return super.onTouchEvent(event); 

} 

} 

這是XML文件。在一場真正的比賽中,我不會以這種方式製造這艘船。您需要更改一些XML才能使其工作。此外,您將希望以不同的方式設置圖像視圖的大小,因爲對像我這樣的值進行硬編碼是不好的。我爲了速度做到了。

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:tools="http://schemas.android.com/tools" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
tools:context="com.honeymanappdev.bradleyhoneyman.moveaimageviewbasedonusertouch.MainActivity"> 

<ImageView 
    android:id="@+id/thing" 
    android:layout_width="100dp" 
    android:layout_height="100dp" 
    android:src="@drawable/grey_star"/> 

<TextView 
    android:id="@+id/coords" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_alignParentLeft="true" 
    android:layout_alignParentTop="true"/> 

我建議用別的東西來加載位圖。

+0

只是想知道我必須使用XML部分? – Kingbluesapphire

+0

你可以使用java編寫圖像視圖,這需要你修改我寫的代碼。首先我會使用XML。然後修改 – holycatcrusher

+0

事情是即時通訊不使用XML只是使用Java ...所以生病嘗試修改到我的知識最好的Java – Kingbluesapphire

1

我讀過這個,並且會推薦使用Picasso來加載你的位圖。這是一項了不起的服務。它也是開源的。