0

I want to know a little in gaming world, so i'm trying first to create a graphical object that will start sliding with touch listener and when it arrives to the screen borders it will be translated in another side to let it be always visible. i know that i must put a runnable or thread inside my code, but first i should not let the object pass the screen borders.

any idea how to continue ?

public class MainActivity extends Activity implements OnTouchListener{

TextView _view;
ViewGroup _root;
private int _xDelta;
private int _yDelta;
private int X1,X2, Y1,Y2;


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    _root = (ViewGroup) findViewById(R.id.root);
    _view = (TextView) findViewById(R.id.tv1);

    RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(150, 50);
    layoutParams.leftMargin = 50;
    layoutParams.topMargin = 50;
    layoutParams.bottomMargin = -250;
    layoutParams.rightMargin = -250;
    _view.setLayoutParams(layoutParams);

    _view.setOnTouchListener(this);
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.main, menu);
    return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    if (item.getItemId() == R.id.page_refresh) {
        Intent i = new Intent(this,MainActivity.class);
        startActivity(i);
        this.finish();
        }
    return super.onOptionsItemSelected(item);
}

@Override
public boolean onTouch(View view, MotionEvent event) {
    final int X = (int) event.getRawX();
    final int Y = (int) event.getRawY();
    switch (event.getAction() & MotionEvent.ACTION_MASK) {
    case MotionEvent.ACTION_DOWN:
        RelativeLayout.LayoutParams lParams = (RelativeLayout.LayoutParams) view.getLayoutParams();
        X1 = X;
        Y1 = Y;
        _xDelta = X - lParams.leftMargin;
        _yDelta = Y - lParams.topMargin;
        break;
    case MotionEvent.ACTION_UP:
        break;
    case MotionEvent.ACTION_POINTER_DOWN:
        break;
    case MotionEvent.ACTION_POINTER_UP:
        break;
    case MotionEvent.ACTION_MOVE:
        RelativeLayout.LayoutParams layoutParams = (RelativeLayout.LayoutParams) view.getLayoutParams();
        layoutParams.leftMargin = X - _xDelta;
        layoutParams.topMargin = Y - _yDelta;
        layoutParams.rightMargin = -250;
        layoutParams.bottomMargin = -250;
        X2 = X;
        Y2 = Y;
     /*   view.setX(X - _xDelta);
        view.setY(Y - _yDelta);
        view.setLayoutParams(view.getLayoutParams());*/
        view.setLayoutParams(layoutParams);
        if(X1 < X2)
            view.animate().translationX(X+5).translationY(getTransY(X));
        else if(X1 > X2)
            view.animate().translationX(X-5).translationY(getTransY(X));
        else {
            if(Y1 < Y2)/*Math.max(Math.abs(Y1), Math.abs(Y2))*/
                view.animate().translationY(Y-5);
            else view.animate().translationY(Y+5);
            }
        break;
} 
_root.invalidate();
return true;
}

public float getTransY(float x){
    float k = (Y2-Y1)/(X2-X1);
    return k*x;
}

}
Marcin Orlowski
  • 72,056
  • 11
  • 123
  • 141

1 Answers1

1

You need to check width and height before changing LayoutParams and before animating as the following:

DisplayMetrics displayMetrics = context.getResources().getDisplayMetrics();

float dpHeight = displayMetrics.heightPixels / displayMetrics.density;
float dpWidth = displayMetrics.widthPixels / displayMetrics.density;

if (X - _xDelta - view.getWidth() < dpWidth)
   layoutParams.leftMargin = X - _xDelta - view.getWidth();
else
   layoutParams.leftMargin = dpWidth - view.getWidth();


//Repeat same logic for Y and animation X+5 and Y+5 etc
Amen Ayach
  • 4,288
  • 1
  • 23
  • 23