Я разрабатываю игру, и в этой игре мне нужно перемещать изображение на холсте с одной точки на другую в любом направлении, а не только по вертикали или по горизонтали.
Как я могу переместить это изображение таким образом?
Я разрабатываю игру, и в этой игре мне нужно перемещать изображение на холсте с одной точки на другую в любом направлении, а не только по вертикали или по горизонтали.
Как я могу переместить это изображение таким образом?
Я не мог понять, чего вы на самом деле хотите, но вот что я пробовал.
interface coordinateListener
{
public void currentPosition(float x,float y);
}
public class ImageView extends View{
int width;
int height;
RectF rect = new RectF();
float x=0f,y=0f;
float dX,dY;
float mStartX,mStartY;
float mEndX,mEndY;
Paint paint = new Paint();
Bitmap mBitmap;
TranslateAnimation anim;
View view;
coordinateListener mListener;
public ImageView(Context context) {
super(context);
init();
}
public ImageView(Context context, AttributeSet attrs) {
super(context, attrs);
init();
}
public ImageView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init();
}
public void init()
{
view = this;
}
@Override
protected void onMeasure(int widthMeasureSpec,int heightMeasureSpec)
{
super.onMeasure(widthMeasureSpec,heightMeasureSpec);
width = getMeasuredWidth();
height = getMeasuredHeight();
rect.set(0,0,width,height);
}
@Override
protected void onDraw(Canvas canvas)
{
super.onDraw(canvas);
if(mBitmap!=null) {
canvas.drawBitmap(mBitmap,0,0,paint);
}
}
@Override
public boolean onTouchEvent(MotionEvent event)
{
int action = event.getAction() & MotionEvent.ACTION_MASK;
switch (action)
{
case MotionEvent.ACTION_DOWN:
dX = this.getX() - event.getRawX();
dY = this.getY() - event.getRawY();
break;
case MotionEvent.ACTION_MOVE:
y = event.getRawY();
x = event.getRawX();
y += dY;
x+=dX;
this.setY(y);
this.setX(x);
mListener = (coordinateListener)getContext();
mListener.currentPosition(x,y);
invalidate();
break;
}
return true;
}
public void startCoordinates(float x,float y)
{
mStartX = x;
mStartY = y;
}
public void endCoordinates(float x,float y)
{
mEndX = x;
mEndY = y;
}
public void startTranslation(long duration)
{
anim = new TranslateAnimation(mStartX,mEndX,mStartY,mEndY);
anim.setDuration(duration);
anim.setFillAfter(true);
anim.setAnimationListener(new Animation.AnimationListener() {
@Override
public void onAnimationStart(Animation animation) {
}
@Override
public void onAnimationEnd(Animation animation) {
view.setX((int)mEndX);
view.setY((int)mEndY);
animation.setFillAfter(false);
}
@Override
public void onAnimationRepeat(Animation animation) {
}
});
this.startAnimation(anim);
}
}
Вы можете перетащить его из одной позиции в другую или использовать "Перевести", чтобы переместить его... вот так,
view.startCoordinates(0f,0f);
view.endCoordinates(500f,0f);
view.startTranslation(3000);
Взгляните на эту библиотеку. Это должно помочь вам с перемещением, и я думаю, что перетаскивание объектов, таких как изображение, и т.д. - PhysicsLayout. Здесь вы можете увидеть перемещение с двумя направлениями - X, Y. Если вы хотите переместить в том числе Z, есть только один способ его реализации, вы должны использовать простое масштабирование.
Если вам нужно что-то еще, есть много мощных и симпатичных приложений Framework, Environment.
После получения математической лекции выясняется, что это легко решить. Во-первых, нам нужно получить угол, на который будет двигаться цель.
float deltaX = targetX - startX;
float deltaY = targetY - startY;
float angle = Math.atan2( deltaY, deltaX );
startX/Y может быть текущим X/Y.
Теперь, когда мы вычислили угол, мы можем применить его к текущим координатам:
currentX += speed * Math.cos(angle);//Using cos
currentY += speed * Math.sin(angle);//or sin
для обработки вычислений того, сколько X и Y будут увеличены. Использование скорости в качестве настраиваемой переменной, если вам также необходимо настроить пользовательскую скорость. Если вам не нужна дополнительная скорость, удалите переменную.
И чтобы переместить объект, примените X/Y к объекту:
c.drawBitmap(bm, x, y, null);
Пример:
int speed = 10;
int x, y;
int targetX = 100, targetY = 600;
int startX = 900, startY = 100;
public void render(Canvas c){
super.draw(c);
float deltaX = targetX - startX;
float deltaY = targetY - startY;
float angle = Math.atan2( deltaY, deltaX );
x += speed * Math.cos(angle);//Using cos
y += speed * Math.sin(angle);//or sin
c.drawBitmap(bm, x, y, null);
(...)
}