要用到surfaceview,在实现手指缩放和拖拽时出现了问题。可拖拽了缩放有问题,可缩放了,拖拽有问题。
请哪位好心的大侠给一段范例脚本,学习一下,万分感激。
请哪位好心的大侠给一段范例脚本,学习一下,万分感激。
解决方案 »
- android 模拟器 GPS/Network 进行定位时出错
- android popupWindow获取焦点后,parent如何响应点击事件
- 请教Android开发
- android手机软件开发
- 关于android版本代码拷贝问题
- 每次Android新版发布后ADT,SDK等等都得更新好长时间,请问有什么好办法吗?
- 如何在在自己开发的软件中运用谷歌地图?
- Android 怎样接收十六进制数据?急!!!
- 在没有接入同一个网络的前提下,wifi设备与移动应用APP如何实现如何发现设备?实现初始化配置?
- 求救,用户登录后的相关信息怎么读取保存才合适?
- 【求助】Android SDK 4.2的帮助文档API在哪里?
- android usb 插拔监听
import android.content.Context;
import android.content.res.Configuration;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Rect;
import android.os.Bundle;
import android.view.GestureDetector;
import android.view.KeyEvent;
import android.view.MotionEvent;
import android.view.SurfaceHolder;
import android.view.SurfaceHolder.Callback;
import android.view.SurfaceView;public class MainActivity extends Activity {
/** Called when the activity is first created. */ private SurfaceView videoView;
private SurfaceHolder sfh;
private Canvas canvas;
private Paint paint;
private boolean flag = true;
private Bitmap bmpIcon;
private int x1, x2, y1, y2;
private float rate = 1;
private float oldRate = 1;
private float oldLineDistance;
private boolean isFirst = true;
private MySurfaceView mySurfaceView; private GestureDetector mGestureDetector;
private float scale = 1f; // 缩放比例,默认为1
Rect src = null;
Rect dest = null;
private int bmpWidth;
private int bmpHeight;
private int scrWidth;
private int scrHeight;
private int xOffset;
private int yOffset;
private int xAfterDrag = 0;
private int yAfterDrag = 0;
private int xBeforeDrag = 0;
private int yBeforeDrag = 0;
private int xDest;
private int yDest;
private int hDest;
private int wDest;
private boolean isDrag = false;
private int curWidth;
private int curHeight;
private float baseValue; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(new MySurfaceView(this));
videoView = (SurfaceView) findViewById(R.id.videoView); bmpIcon = BitmapFactory.decodeResource(this.getResources(),
R.drawable.mmm);
bmpWidth = bmpIcon.getWidth();
bmpHeight = bmpIcon.getHeight();
paint = new Paint();
} class MySurfaceView extends SurfaceView implements Callback { public MySurfaceView(Context context) {
super(context);
sfh = this.getHolder();
sfh.addCallback(this); } @Override
public void surfaceChanged(SurfaceHolder holder, int format, int width,
int height) {
// TODO Auto-generated method stub } @Override
public void surfaceCreated(SurfaceHolder holder) {
src = new Rect(0, 0, bmpWidth, bmpHeight);
scrWidth = this.getWidth();
scrHeight = this.getHeight(); // 以下是以屏幕大小显示全图片
curWidth = scrWidth;
curHeight = scrHeight;
xDest = 0;// (scrWidth - bmpWidth) / 2;
yDest = 0;// (scrHeight - bmpHeight) / 2; // 以下是以图片原始大小显示
curWidth = bmpWidth;
curHeight = bmpHeight;
xDest = (scrWidth - bmpWidth) / 2;
yDest = (scrHeight - bmpHeight) / 2; wDest = curWidth + xDest;
hDest = curHeight + yDest;
dest = new Rect(xDest, yDest, wDest, hDest); new ImageThread().start();
} @Override
public void surfaceDestroyed(SurfaceHolder holder) {
// TODO Auto-generated method stub
}
} @Override
public boolean onTouchEvent(MotionEvent event) {
int pointerCount = event.getPointerCount();
int pointerId = 0;
int action = (event.getAction() & MotionEvent.ACTION_MASK) % 5;// 统一单点和多点
switch (action) {
case MotionEvent.ACTION_DOWN:
baseValue = 0;
case MotionEvent.ACTION_MOVE:
if (event.getPointerCount() == 1) {
drag(event);
} else if (event.getPointerCount() == 2) {
x1 = (int) event.getX(0);
y1 = (int) event.getY(0);
x2 = (int) event.getX(1);
y2 = (int) event.getY(1);
float x = event.getX(0) - event.getX(1);
float y = event.getY(0) - event.getY(1);
float value = (float) Math.sqrt(x * x + y * y);// 计算两点的距离
if (baseValue == 0) {
baseValue = value;
} else {
rate = value / baseValue;
rate = (rate < 1f ? 1f : rate);
}
}
}
return true;
} @Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
return super.onKeyDown(keyCode, event);
} class ImageThread extends Thread {
@Override
public void run() {
while (flag) {
long start = System.currentTimeMillis();
myDraw();
long end = System.currentTimeMillis();
try {
if (end - start < 50) {
Thread.sleep(50 - (end - start));
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
} private void drag(MotionEvent event) {
// rate = 1f;
if (event.getPointerCount() == 1) {
if (event.getAction() == MotionEvent.ACTION_DOWN) {
xBeforeDrag = Math.round(event.getX());
yBeforeDrag = Math.round(event.getY());
} else if (event.getAction() == MotionEvent.ACTION_MOVE) {
xAfterDrag = Math.round(event.getX());
yAfterDrag = Math.round(event.getY()); xOffset = xAfterDrag - xBeforeDrag;
yOffset = yAfterDrag - yBeforeDrag; xBeforeDrag = xAfterDrag;
yBeforeDrag = yAfterDrag; // 计算需要绘制的区域
xDest += xOffset;
yDest += yOffset; // 绘制时,上边界应该是<=0的值,如果大于0了,则上面出黑边了
xDest = (xDest > 0 ? 0 : xDest);
yDest = (yDest > 0 ? 0 : yDest); // 如果左上坐标小于屏幕的宽度减去目标画布的宽度,则下边出黑边了
if (xDest < 0) {
xDest = (xDest < scrWidth - curWidth ? scrWidth - curWidth
: xDest);
wDest = curWidth + xDest;
} if (yDest < 0) {
yDest = (yDest < scrHeight - curHeight ? scrHeight
- curHeight : yDest);
hDest = curHeight + yDest;
} dest = new Rect(xDest, yDest, wDest, hDest);
isDrag = true;
}
} } public void myDraw() {
try {
canvas = sfh.lockCanvas();
if (canvas != null) {
canvas.drawColor(Color.BLACK);
canvas.save();
canvas.scale(rate, rate, scrWidth / 2, scrHeight / 2);
canvas.drawBitmap(bmpIcon, src, dest, paint);
canvas.drawLine(x1, y1, x2, y2, paint);
canvas.restore();
sfh.unlockCanvasAndPost(canvas);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
}
} @Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
}
}