您的位置:首页 > 其它

点击视图中的图片拖动位置

2013-07-18 14:43 183 查看
代码如下,不做分析,请看注释:

一般配置如下的主题

android:theme="@android:style/Theme.Black.NoTitleBar.Fullscreen"


public class MySurfaceView extends SurfaceView {

private SurfaceHolder holder ;
private Bitmap icBitmap ;
private DrawThread thread ;
boolean isMove = false ;
private float cx , cy ;//当前图片的位置坐标
private float ex , ey ;//事件发生的位置坐标
int vw,vh,bw,bh ;//窗口的长宽和图片的长宽

public MySurfaceView(Context context) {
this(context,null) ;
}

public MySurfaceView(Context context, AttributeSet attrs) {
super(context, attrs);
init();
holder = getHolder() ;
holder.addCallback(callback);
}

private void init() {
icBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.ic_launcher) ;
}

private Callback callback = new Callback() {
//当SurfaceView被从窗口剥离后会调用此方法
//回收资源,和停止线程
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
thread.interrupt();
icBitmap.recycle();
}
//当SurfaceView被创建后会调用此方法
//绘制线程的启动
@Override
public void surfaceCreated(SurfaceHolder holder) {
//得到屏幕的长宽
vw = holder.getSurfaceFrame().width() ;
vh = holder.getSurfaceFrame().height() ;
//得到图片的长宽
bw = icBitmap.getWidth() ;
bh = icBitmap.getHeight() ;
if(thread == null){
thread = new DrawThread() ;
}thread.start();
}
//SurfaceView 的大小发生改变的时候调用此方法
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width,
int height) {

}
};
final class DrawThread extends Thread{
@Override
public void run() {

Matrix m = new Matrix() ;
while(!isInterrupted()){
//不能超出屏幕范围,超过了固定在边沿
if(cx > vw - bw)cx = vw -bw ;
if(cy > vh - bh)cy = vh -bh ;
m.setTranslate(cx, cy);
Canvas c = holder.lockCanvas() ;
if (c == null)break ;
c.drawColor(Color.BLACK);
c.drawBitmap(icBitmap, m, null);
//c.drawBitmap(icBitmap, cx, cy, null);
//对画布进行解锁和调用postInvalidate()
holder.unlockCanvasAndPost(c);
}
}
}
//触摸屏幕调用的方法
 @Override
public boolean onTouchEvent(MotionEvent event) {
ex = event.getX() ;
ey = event.getY() ;
int action = event.getAction() ;
switch(action){
case MotionEvent.ACTION_DOWN:
//判断事件的点击是否发生在图片上
if(cx<ex && ex<cx + bw &&
cy<ey && ey <cy + bh)
isMove = true ;
break ;
case MotionEvent.ACTION_UP:
isMove = false ;
break ;
case MotionEvent.ACTION_MOVE :
if(isMove == true){
cx = ex ;
cy = ey ;
}
break ;
}
return true ;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐