마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

버튼 한번 터치하면 이미지 계속 이동

0 추천

-MainActivity.java-

package com.example.imagemove1;

import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
 
public class MainActivity extends Activity
{
    Character character;
 
    protected void onCreate( Bundle savedInstanceState )
    {
        super.onCreate( savedInstanceState );
        setContentView( R.layout.activity_main );
 
        character = (Character)findViewById( R.id.character );       
 
        Button btnLeft = (Button)findViewById( R.id.btnLeft );
        btnLeft.setOnClickListener( new OnClickListener()
        {
 
            public void onClick( View v )
            {
                character.move( -1 );
            }
        } );
 
        Button btnRight = (Button)findViewById( R.id.btnRight );
        btnRight.setOnClickListener( new OnClickListener()
        {
 
            public void onClick( View v )
            {
                character.move( 1 );
            }
        } );
    }

 @Override
 public boolean onCreateOptionsMenu(Menu menu) {
  // Inflate the menu; this adds items to the action bar if it is present.
  getMenuInflater().inflate(R.menu.main, menu);
  return true;
 }

}

-Character.java-

package com.example.imagemove1;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.util.AttributeSet;
import android.view.Display;
import android.view.View;
import android.view.WindowManager;
 
public class Character extends View
{
    Paint  paint;
    Bitmap bitmap;
    int    X;
    int    sw; // 스크린넓이
    int    c; // 이미지 넓이의 절반
 
 @SuppressWarnings("deprecation")
 public Character( Context context, AttributeSet attrs )
    {
        super( context, attrs );
 
        WindowManager wm = (WindowManager)context.getSystemService( Context.WINDOW_SERVICE );
        Display display = wm.getDefaultDisplay();
        sw = display.getWidth();
 
        bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.ball);       
        c = bitmap.getWidth() / 2;
        X = sw/ 2; // 초기 X값을 구한다. (가운데)
    }
 
    @Override
    protected void onDraw( Canvas canvas )
    {
        super.onDraw( canvas );
        canvas.drawBitmap( bitmap, ( X - c ), 0, paint );
        invalidate();
    }
 
    public void move( int d )
    {
        int dx = X + ( 30 * d ); // 왼쪽은 마이너스, 오른쪽은 플러스

        if ( dx > c && dx < ( sw - c ) )
        {
            X = dx;
        }
 
    }
}

-activity_main.xml-

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent" 
    android:orientation="vertical" android:gravity="center"
    tools:context=".MainActivity" >

  <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="280dp" >
        <com.example.imagemove1.Character
            android:id="@+id/character"
            android:layout_gravity="center_vertical"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />
    </LinearLayout>
         
  <LinearLayout
      android:layout_width="wrap_content"
         android:layout_height="wrap_content" >
    
   <Button
    android:id="@+id/btnLeft"
    android:layout_width="100dp"
    android:layout_height="50dp"
    android:text="@string/btnLeft" />
 
   <Button
    android:id="@+id/btnRight"
    android:layout_width="100dp"
    android:layout_height="50dp"
    android:text="@string/btnRight" />
   
  </LinearLayout>
</LinearLayout>

코드를 보시면 왼쪽 버튼을 한번 누를때마다 왼쪽으로 이미지가 한칸씩 이동되고 오른쪽 버튼을 한 번 누를때마다 오른쪽으로 한칸씩 이동을 하게 만들었습니다. 그런데 버튼을 한번 누르면 한칸씩 이동하는 것이 아니고 한번 누르면 이미지 계속 이동하는 코드는 어떻게 짜야 할까요? 즉, 왼쪽 버튼을 한번 누르면 왼쪽으로 계속 이미지가 움직이게 하는 코드입니다. 왼쪽으로 움직이다가 오른쪽 버튼을 누르면 다시 오른쪽으로 이미지가 계속 이동하는 코드를 짜주시면 감사하겠습니다.

martin_Mac (370 포인트) 님이 2013년 5월 30일 질문

2개의 답변

0 추천
안녕하세요.

이동되는 로직을 무한루프로 돌리면 되겠네요.

1초에 한번식 움직이고 싶다면 타이머를 쓰면 될꺼공,

플래그를 하나두어서 한번 누르면 루프로 계속이동하게 만들고 또한번누르면 꺼지게

하면 될꺼 같네요.
  (11,920 포인트) 님이 2013년 5월 30일 답변
0 추천
한번 누르면.. 이라는 조건이 조금 명확치 않네요

누르는 동안 이동하는것인지 누르고 뗀 이후부터 이동하는것인지..
블랙넥원 (9,600 포인트) 님이 2013년 5월 30일 답변
한번 누르고 뗀 이후부터 이동하는 겁니다..
그럼 현재 있는 온클릭 이벤트에서 호출하는
character.move( 1 ); 를
별도의 쓰레드를 이용해서 반복호출만 하시면 되겠네요...
물론 언제 멈추는지 조건은 추가하셔야겠죠..
...