먼저 제가 작성한 코드 입니다.
- main.java -
package com.example.imagemove2;
import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
public class MainActivity extends Activity {
BitmapView bitmapview;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
bitmapview = (BitmapView)findViewById(R.id.bitmapview);
}
@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;
}
}
- BitmapView.java-
package com.example.imagemove2;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Rect;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.Display;
import android.view.View;
import android.view.WindowManager;
public class BitmapView extends View {
Bitmap bitmap;
int width;
int height;
int X;
int sw;
int c;
int dx;
int dy;
@SuppressWarnings("deprecation")
public BitmapView( 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(context.getResources(), R.drawable.ball);
// 얘 뒤져보면 byte[] 에서 bitmap생성하는 것도 있심
width = bitmap.getWidth();
height = bitmap.getHeight();
c = bitmap.getWidth() / 2;
X = sw / 2; // 초기 X값을 구한다. (가운데)
}
@Override
protected void onDraw(Canvas canvas) {
canvas.drawBitmap(
bitmap, // 출력할 bitmap
new Rect(0,0,width,height), // 출력할 bitmap의 지정된 영역을 (sub bitmap)
new Rect(dx,dy,dx+width,dy+height), // 이 영역에 출력한다. (화면을 벗어나면 clipping됨)
null);
super.onDraw(canvas);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
switch(event.getAction()) {
case MotionEvent.ACTION_DOWN:
break;
case MotionEvent.ACTION_UP:
break;
case MotionEvent.ACTION_MOVE:
// 주루룩 drag했을 경우 히스토리가 모두 기록되어서 전달됨
int length=event.getHistorySize();
float sx, sy, ex, ey;
if (length != 0) {
sx = event.getHistoricalX(0);
sy = event.getHistoricalY(0);
ex = event.getHistoricalX(length-1);
ey = event.getHistoricalY(length-1);
dx += (int)(ex-sx);
dy += (int)(ey-sy);
}
invalidate();
break;
}
return true;
}
}
-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" >
<com.example.imagemove2.BitmapView
android:id="@+id/bitmapview"
android:layout_gravity="center_vertical"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>
제가 문의 드린점은...
1. 터치시 이미지 자유자재로 드래그 하는건데.. 제가 현재 갤노트를 사용하고 있어 펜을 가지고 이동하면 잘 이동되는데.. 손가락으로 누르고 이동하면 안되네요..ㅡㅡ
2. 처음의 이미지 위치가 가운데에서 시작하고 싶은데.. 디버깅하여 결과를 확인하여 왼쪽 상단에 위치하여 있네요 ㅠㅠ 가운데 위치를 설정했는데도 그러네요 ㅠㅠ xml 부분에 코드를 덜 입력한건지.. 궁금합니다..
3. 마지막으로 java 파일이 두가지인데.. 한 파일에 합칠수는 없는건가요? 많은 질문을 하게 되서 정말 죄송합니다..ㅠㅠ