안드로이드 개발 질문/답변
(글 수 45,052)
package org.abp.zoom;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.drawable.Drawable;
import android.view.KeyEvent;
import android.view.View;
public class Zoom extends View {
private Drawable image;
private int zoomControler=20;
public Zoom(Context context)
{
super(context);
image=context.getResources().getDrawable(R.drawable.miranda_kerr);
setFocusable(true);
}
@Override
protected void onDraw(Canvas canvas) {
// TODO Auto-generated method stub
super.onDraw(canvas);
image.setBounds((getWidth()/2)-zoomControler, (getHeight()/2)-zoomControler, (getWidth()/2)+zoomControler, (getHeight()/2)+zoomControler);
image.draw(canvas);
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if(keyCode==KeyEvent.KEYCODE_DPAD_UP)// zoom in
zoomControler+=10;
if(keyCode==KeyEvent.KEYCODE_DPAD_DOWN) // zoom out
zoomControler-=20;
if(zoomControler<10)
zoomControler=10;
invalidate();
return true;
}
}
package org.abp.zoom;
import android.app.Activity;
import android.os.Bundle;
public class Zooming extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
setContentView(new Zoom(this));
}
}
package com.ssamddak;
import android.app.Activity;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.os.Bundle;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;
public class TestImageNavigation extends Activity {
NaviImageView nImageView;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);
requestWindowFeature(Window.FEATURE_NO_TITLE);
nImageView = new NaviImageView(this);
nImageView.setBitmap( BitmapFactory.decodeResource(getResources(), R.drawable.samples_3));
setContentView(nImageView);
}
class NaviImageView extends View {
public Bitmap image = null;
private float startX = 0;
private float startY = 0;
private float userX = 0;
private float userY = 0;
final static int TOUCH_TOLERANCE = 4;
public NaviImageView(Context context) {
super(context);
// TODO Auto-generated constructor stub
}
public NaviImageView(Context context, AttributeSet attrs) {
super(context, attrs);
// TODO Auto-generated constructor stub
}
public NaviImageView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
// TODO Auto-generated constructor stub
}
public void setBitmap(Bitmap temp) {
image = temp;
userX = (image.getWidth() - getWindowManager().getDefaultDisplay().getWidth())/ -2;
userY = (image.getHeight() - getWindowManager().getDefaultDisplay().getHeight())/ -2;
}
@Override
protected void onDraw(Canvas canvas) {
// TODO Auto-generated method stub
if ( image != null)
canvas.drawBitmap(image, userX, userY, null);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
// TODO Auto-generated method stub
float x = event.getX();
float y = event.getY();
switch ( event.getAction() ) {
case MotionEvent.ACTION_DOWN:
setUserNavi(x, y);
break;
case MotionEvent.ACTION_MOVE:
processNavi(x, y);
setUserNavi(x, y);
invalidate();
break;
case MotionEvent.ACTION_UP:
clearStartPoint();
invalidate();
break;
}
return true;
}
private void processNavi(float x, float y) {
if( Math.abs( (startX - x)) > TOUCH_TOLERANCE ||
Math.abs( (startY - y) ) > TOUCH_TOLERANCE ) {
if ( startX > x )
userX -= (startX - x );
else
userX += ( x - startX );
if ( startY < y)
userY += ( y - startY );
else
userY -= (startY - y);
}
}
private void setUserNavi(float x, float y) {
startX = x; startY = y;
}
private void clearStartPoint() {
startX = startY = 0;
}
}
}
저 두개의 소스를 합쳐서 zoom 했을때도 이미지를 움직이게 하고 싶은데 잘 안되네요.. 계속적으로 코딩을 해봤지만 혹시나 아시는 분이 있지 않을까해서 글을 올립니다.
zoom 소스에서 핵심 부분은 바로
image.setBounds((getWidth()/2)-zoomControler, (getHeight()/2)-zoomControler, (getWidth()/2)+zoomControler, (getHeight()/2)+zoomControler);
image.draw(canvas);
이 부분인데요.. setBounds부분만 bitmap으로 하면 될거 같은데.. 여간 어려운게 아니네요..
zoom in/out 소스는 필요하신분들은 참고 하시면 좋겠네요..^^
PDK소스의 eclair\packages\apps\Gallery\src\com\android\camera\ImageViewTouchBase.java 코드를 참고 해 보세요.
거기에 보면.. zoomTo()나 postTranslate()등이 원하시는 역활을 하는 것으로 알고 있습니다.