在android中,如何处理标签的动画,使其始终位于屏幕边框内?

在android中,如何处理标签的动画,使其始终位于屏幕边框内?,android,animation,native-code,motion,Android,Animation,Native Code,Motion,我想了解一点游戏世界的情况,所以我首先尝试创建一个图形对象,该对象将使用touch listener开始滑动,当它到达屏幕边界时,它将被转换到另一侧,以便始终可见。我知道我必须在我的代码中放置一个可运行或线程,但首先我不应该让对象通过屏幕边界 你知道怎么继续吗 public class MainActivity extends Activity implements OnTouchListener{ TextView _view; ViewGroup _root; private int _x

我想了解一点游戏世界的情况,所以我首先尝试创建一个图形对象,该对象将使用touch listener开始滑动,当它到达屏幕边界时,它将被转换到另一侧,以便始终可见。我知道我必须在我的代码中放置一个可运行或线程,但首先我不应该让对象通过屏幕边界

你知道怎么继续吗

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;
}

}
public类MainActivity扩展了活动实现到TouchListener上{
文本视图_视图;
视图组_根;
私人国际电信公司;
私人国际酒店;
专用int X1、X2、Y1、Y2;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
_root=(视图组)findViewById(R.id.root);
_视图=(TextView)findViewById(R.id.tv1);
RelativeLayout.LayoutParams LayoutParams=新的RelativeLayout.LayoutParams(150,50);
layoutParams.leftMargin=50;
layoutParams.topMargin=50;
layoutParams.bottomMargin=-250;
layoutParams.rightMargin=-250;
_view.setLayoutParams(layoutParams);
_view.setOnTouchListener(这个);
}
@凌驾
公共布尔onCreateOptions菜单(菜单){
getMenuInflater().充气(R.menu.main,menu);
返回true;
}
@凌驾
公共布尔值onOptionsItemSelected(菜单项项){
if(item.getItemId()==R.id.page\u刷新){
意图i=新意图(此,MainActivity.class);
星触觉(i);
这个;
}
返回super.onOptionsItemSelected(项目);
}
@凌驾
公共布尔onTouch(视图、运动事件){
final int X=(int)event.getRawX();
final int Y=(int)event.getRawY();
开关(event.getAction()&MotionEvent.ACTION\u掩码){
case MotionEvent.ACTION\u DOWN:
RelativeLayout.LayoutParams lParams=(RelativeLayout.LayoutParams)视图。getLayoutParams();
X1=X;
Y1=Y;
_xDelta=X-lParams.leftMargin;
_yDelta=Y-lParams.topMargin;
打破
case MotionEvent.ACTION\u UP:
打破
case MotionEvent.ACTION\u指针\u向下:
打破
case MotionEvent.ACTION\u指针\u向上:
打破
case MotionEvent.ACTION\u移动:
RelativeLayout.LayoutParams LayoutParams=(RelativeLayout.LayoutParams)视图。getLayoutParams();
layoutParams.leftMargin=X-xDelta;
layoutParams.topMargin=Y-_yDelta;
layoutParams.rightMargin=-250;
layoutParams.bottomMargin=-250;
X2=X;
Y2=Y;
/*视图.setX(X-xDelta);
视图。setY(Y-yDelta);
view.setLayoutParams(view.getLayoutParams())*/
view.setLayoutParams(layoutParams);
if(X1X2)
view.animate().translationX(X-5).translationY(getTransY(X));
否则{
如果(Y1
在更改
LayoutParams
和设置动画之前,需要检查宽度和高度,如下所示:

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
DisplayMetrics DisplayMetrics=context.getResources().getDisplayMetrics();
float dpHeight=displayMetrics.heightPixels/displayMetrics.density;
float dpWidth=displayMetrics.widthPixels/displayMetrics.density;
if(X-xDelta-view.getWidth()