Как переместить изображение на экран?
Я хочу переместить изображение на экран, и я могу это сделать, но не правильно. Изображение идет нормально вниз, и я хочу, чтобы оно начало двигаться вверх в другом направлении, как только оно переместится в нижнюю часть экрана.
Вот что я попробовал. В приведенном ниже коде margenMaXX
ширина экрана и margenmaxy
высота экрана
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// setContentView(R.layout.activity_main);
Thread myThread = new Thread(new UpdateThread());
myThread.start();
public class UpdateThread implements Runnable {
@Override
public void run() {
//... code to manipulate position
while (i<margenMaxX){
if(j<margenmaxy) {
try {
runOnUiThread(new Runnable() {
@Override
public void run() {
/*mDrawable.setBounds(i, j ,i+ width, i+ height);
mDrawable.draw(cc);
invalidate();*/
}
});
Thread.sleep(200);
i=i+10;
j=j+10;
} catch (InterruptedException e) {
e.printStackTrace();
}
}else if(j>=margenmaxy-height){
try {
runOnUiThread(new Runnable() {
@Override
public void run() {
/*mDrawable.setBounds(i, j ,i+ width, i+ height);
mDrawable.draw(cc);
invalidate();*/
}
});
Thread.sleep(200);
i=i-10;
j=j-10;
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
public class AnimatedView extends ImageView {
public AnimatedView(Context context) {
super(context);
// TODO Auto-generated constructor stub
mDrawable = new ShapeDrawable(new OvalShape());
mDrawable.getPaint().setColor(0xffffAC23);
}
protected void onDraw(final Canvas cc) {
final Context context = null;
mDrawable.setBounds(i, j ,i+ width, i+ height);
mDrawable.draw(cc);
invalidate();
}
}
Обновление 1:
Используя этот код, мяч движется вверх и в другую сторону после того, как упал на землю. Теперь я хочу, чтобы мяч вернулся, когда он достигнет правильной границы. Я сделал код для этого, но он не вернется. Моя конечная цель - разработать игру, в которой мяч должен быть слева или справа. Он должен упасть на землю и пойти в противоположном направлении, ударить стену и вернуться. Мяч должен делать эту работу, пока игра продолжается.
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// setContentView(R.layout.activity_main);
Thread myThread = new Thread(new UpdateThread());
myThread.start();
public class UpdateThread implements Runnable {
boolean mMoveDown=false;
boolean mMoveUp = false;
@Override
public void run() {
while(!mMoveUp) {
// Move the image down and right.
try {
runOnUiThread(new Runnable() {
@Override
public void run() {
}
});
Thread.sleep(200);
i=i+10;
j=j+10;
// Try posting a runnable to the UI thread to update the view.
} catch (InterruptedException e) {
e.printStackTrace();
}if(j >= margenmaxy)
{
// Change to moving up phase.
mMoveUp = true;
}
}
while(mMoveUp){
try {
runOnUiThread(new Runnable() {
@Override
public void run() {
}
});
Thread.sleep(200);
i=i + 10;
j=j - 10;
} catch (InterruptedException e) {
e.printStackTrace();
} if(i >= margenMaxX)
{
// Change to moving up phase.
mMoveDown = true;
}
}while(mMoveDown){
try {
runOnUiThread(new Runnable() {
@Override
public void run() {
}
});
Thread.sleep(200);
i=i - 10;
j=j + 10;
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
public class AnimatedView extends ImageView {
public AnimatedView(Context context) {
super(context);
// TODO Auto-generated constructor stub
mDrawable = new ShapeDrawable(new OvalShape());
mDrawable.getPaint().setColor(0xffffAC23);
}
protected void onDraw(final Canvas cc) {
final Context context = null;
mDrawable.setBounds(i, j ,i+ width, j+ height);
mDrawable.draw(cc);
invalidate();
}
}
1 ответ
Этот код имеет два условных оператора, которые перекрываются. Тем не менее, второй проверяется, только если первый не удается. Второе условие:
(j >= margenmaxy - height)
Это автоматически подразумевает (j Что происходит, так это то, что вы ожидаете, произойдет для фазы, когда изображение движется вниз. Но как только вы попытаетесь переместить изображение вверх, условие (j Чтобы решить эту проблему, вам нужно изменить логику. Один простой способ сделать это состоит в том, чтобы логическое состояние удерживало состояние анимации. Эта переменная состояния изменяется в зависимости от того, достигло ли изображение нижней части экрана или нет. Как добавленное примечание, так как вы перемещаете шар влево и вправо, вы можете в конечном итоге и попасть в эти границы. Вы действительно должны реализовать лучшую проверку для этого. Как второе замечание, это, вероятно, не лучший способ создания движущегося изображения в Android. И, наконец, более общим решением является использование Android Property Animation с нужным вам интерполятором. Если вы просто хотите сделать это один раз, View Animation также может быть достаточно.if(j<margenmaxy) {
// Do downward animation.
} else if(j>=margenmaxy-height){
// Do upward animation.
}
public class UpdateThread implements Runnable {
// Variable to store the animation state.
boolean mMoveUp = false;
@Override
public void run() {
//... code to manipulate position
while (i<margenMaxX) {
// IF the animation is in the moving down phase
if(!mMoveUp) {
// Move the image down and right.
i += 10;
j += 10;
// Try posting a runnable to the UI thread to update the view.
try {
runOnUiThread(new Runnable() {
@Override
public void run() {
/*mDrawable.setBounds(i, j ,i+ width, i+ height);
mDrawable.draw(cc);
invalidate();*/
}
});
Thread.sleep(200);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
// We're moving upwards.
else {
// Move up and left
i -= 10;
j -= 10;
try {
runOnUiThread(new Runnable() {
@Override
public void run() {
/*mDrawable.setBounds(i, j ,i+ width, i+ height);
mDrawable.draw(cc);
invalidate();*/
}
});
Thread.sleep(200);
} catch (InterruptedException e) {
e.printStackTrace();
} // Catch!
} // Else!
// Check to see if we've hit the bottom of the screen
if(j >= margenmaxy - height)
{
// Change to moving up phase.
mMoveUp = true;
}
// Note, you can use an altered form of this to switch back and forth
// between moving up and down.
} // while(i < margenmaxx)!
} // run()!
} // UpdateThread!