마스터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>

코드를 보시면 왼쪽 버튼을 한번 누를때마다 왼쪽으로 이미지가 한칸씩 이동되고 오른쪽 버튼을 한 번 누를때마다 오른쪽으로 한칸씩 이동을 하게 만들었습니다. 그런데 버튼을 한번 누르면 한칸씩 이동하는 것이 아니고 한번 누르면 이미지 계속 이동하는 코드는 어떻게 짜야 할까요? 즉, 왼쪽 버튼을 한번 누렀다가 떼면 왼쪽으로 계속 이미지가 움직이게 하는 코드입니다. 왼쪽으로 움직이다가 오른쪽 버튼을 누르면 다시 오른쪽으로 이미지가 계속 이동하는 코드를 작성중인데.. 어디를 수정해야 할지 막막하네요 ㅠㅠ 생 초보입니다...ㅠㅠ 속시원하게 알려주실분 안계신가요? 제발 도와주세요 ㅠㅠㅠ 미치겠네요 ㅠㅠㅠㅠ

 

익명사용자 님이 2013년 6월 3일 질문

2개의 답변

0 추천
제가 생각하는 방법론을 말씀드린다면 다음과 같습니다.

 

1. 왼쪽 혹은 오른쪽 화살표 버튼 누르면

2. 왼쪽 혹은 오른쪽  으로 이동하는 메소드 호출하고(그 메소드 안에는 정해진 시간 후 자신 호출하도록 하는 기능이 들어가 있으면 됩니다.) ,

3. 그 메소드 호출되면 몇 초 후에 다시 왼쪽으로 이동하는 메소드를 호출하도록 한다.

 

ps.

자기 자신을 호출하도록 하든 타이머가 설정된 메소드를 만들어서 전역값 확인해서 왼쪽 또는 오른쪽에

따른 이벤트 처리를 하시든 편하신 방법대로 하시면 됩니다.
비뢰광 (7,400 포인트) 님이 2013년 6월 3일 답변
감사합니다..  근데.. 지금 님께서 하신 말씀이 전 도통 무슨 말인지 모르겠습니다.. 제가 바보 인건지.. 제 자신이 정말 답답하네요.. 이런말씀 드리기 정말 죄송한데요.. 속 시원하게 알려주시면 안될까요...? 너무 급합니다.. 잘알지도 못하고 그냥 알려달라고 하는점... 이해좀 해주시면 안될까요..? ㅠㅠ 제 자신이 많이 부족하고 실력이 없다는거 압니다... 눈 딱 감고 한번만 도와주세요....
저도 아직 초보 개발자 입니다.
비록 급하시더라도 스스로 해결하는 내공을
키우셔야 합니다. 안 그럼 살아 남을 수 없습니다.. ㅠ_ㅠ

일단 질문자님 소스 기준으로 짜보았습니다.
예외처리에 대해서는 질문자님 상황에 맞게 적용하세요.

-MainActivity.java- 에만 추가해주시면 됩니다.

/**
 * -1 : 아무 설정 아님
 * 0     : 왼쪽
 * 1    : 오른쪽
 */
int type = -1;

/**
 * 임의로 2초로 설정하였습니다.
 */
int setTime = 2;

Handler handler = new Handler();

/////////////////////////////////////////////////////////////
위 내용은 전역으로 설정합니다.
/////////////////////////////////////////////////////////////

private void goLeft()
{
    character.move( -1 );
}

private void goRight()
{
    character.move( 1 );
}

private Runnable TimerThread = new Runnable() {
    @Override
    public void run() {
        // TODO Auto-generated method stub
        if(type == 0)
        {
            goLeft();
            handler.postDelayed(TimerThread, 1000 * setTime);
        }
        else if(type == 1)
        {
                                           goRight();
            handler.postDelayed(TimerThread, 1000 * setTime);
        }
    }
};

////////// 위 사항까지 내용 추가하시고
클린 이벤트를 아래와 같이 내용 추가해주세요.

btnLeft.setOnClickListener( new OnClickListener()
         {
  
             public void onClick( View v )
             {
                 character.move( -1 );
                 type = 0;    //왼쪽으로
                 handler.postDelayed(TimerThread, 1000 * setTime);
             }
         } );

btnRight.setOnClickListener( new OnClickListener()
         {
  
             public void onClick( View v )
             {
                 character.move( 1 );
                 type = 1;        // 오른쪽으로
               handler.postDelayed(TimerThread, 1000 * setTime);
             }
         } );
0 추천
    @Override
    protected void onDraw( Canvas canvas )
    {
        super.onDraw( canvas );
        canvas.drawBitmap( bitmap, ( X - c ), 0, paint );
	move( 1 );
        invalidate();
    }	

간단한 힌트를 드리자면 위처럼 하면 한쪽으로 계속 움직입니다.

q1212 (26,020 포인트) 님이 2013년 6월 3일 답변
감사합니다.. 근데 움직이기는 커녕 결과를 확인하면 이미지가 바로 오른쪽으로 이동하여 움직이지 않습니다만.... 이런말씀 드리기 정말 죄송한데요.. 속 시원하게 알려주시면 안될까요...? 너무 급합니다.. 잘알지도 못하고 그냥 알려달라고 하는점... 이해좀 해주시면 안될까요..? ㅠㅠ 제 자신이 많이 부족하고 실력이 없다는거 압니다... 눈 딱 감고 한번만 도와주세요....
int    c; // 이미지 넓이의 절반
int   move=1; ->추가

================================
    public void move( int d )
    {
move = d; ->추가
        int dx = X + ( 30 * d ); // 왼쪽은 마이너스, 오른쪽은 플러스

        if ( dx > c && dx < ( sw - c ) )
        {
            X = dx;
        }
 
    }
===========================================
위의 함수에서
move( 1 ); => move( move);

최대한 저 소스 안건들이고 하면 저 3가지만 하시면 될거에요..
...