Android 台灣中文網
標題:
canvas的圖片縮放和拖曳
[打印本頁]
作者:
onlyhska
時間:
2014-3-26 17:44
標題:
canvas的圖片縮放和拖曳
本帖最後由 onlyhska 於 2014-3-30 16:23 編輯
public class MainActivity extends Activity {
Bitmap bitmap,bt;
ByteBuffer handler ;
int dw,dh;
int bmpWidth,bmpHeight;
SurfaceView sfv;
boolean flag,lag;
Thread conn;
Matrix matrix;
Paint mypaint;
private ScaleGestureDetector mScaleGestureDetector = null;
float scale;
PointF mid = new PointF();
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
dw = getWindowManager().getDefaultDisplay().getWidth();//手機螢幕寬度
dh = getWindowManager().getDefaultDisplay().getHeight();//手機螢幕高度
sfv = (SurfaceView) findViewById(R.id.sfv);
mScaleGestureDetector = new ScaleGestureDetector(this,new ScaleGestureListener());
sfv.getHolder().addCallback(new Callback()
{
@Override
public void surfaceDestroyed(SurfaceHolder holder)
{
//停止執行緒
flag=false;
conn.interrupt();
conn=null;
}
@Override
public void surfaceCreated(SurfaceHolder holder)
{
conn=new Thread(new Runnable()
{
public void run()
{
flag=true;
try
{
String url="http://172.16.17.39/Media/Snapshot?deviceid=7";
IMGParser parser2 = new IMGParser();
InputStream input=parser2.getIMGFromUrl(url);
byte[] data=readFully(input);
bitmap = BitmapFactory.decodeByteArray(data, 0 , data.length);
if(!lag)
{
bmpWidth=bitmap.getWidth();
bmpHeight=bitmap.getHeight();
scale=(float) (dw/(bmpWidth *1.0));
matrix=new Matrix();
matrix.setScale(scale, scale);
matrix.postTranslate(0,(dh-(bmpHeight*scale))/2);//圖片位置
lag=true;
}
synchronized(sfv.getHolder())
{
Canvas canvas = sfv.getHolder().lockCanvas(); // 加鎖
//設定Canvas屬性
canvas.drawColor(Color.BLACK);//設定畫布顏色
canvas.drawBitmap(bitmap, matrix, null);
sfv.getHolder().unlockCanvasAndPost(canvas);//解鎖
}
}
catch (Exception e)
{
e.printStackTrace();
}
}
});
conn.start();
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width,int height)
{
}
});
}
@Override
public boolean onTouchEvent(MotionEvent event) //移動
{
// if (event.getAction() == MotionEvent.ACTION_DOWN) {
//
// float x = event.getX();
//
// float y = event.getY();
//
// Canvas canvas=sfv.getHolder().lockCanvas();
// canvas.drawColor(Color.BLACK);
// // canvas.drawBitmap(bitmap,x,y,null);
//
// sfv.getHolder().unlockCanvasAndPost(canvas);
// }
//
return mScaleGestureDetector.onTouchEvent(event);
}
public class ScaleGestureListener implements ScaleGestureDetector.OnScaleGestureListener
{
@Override
public boolean onScale(ScaleGestureDetector detector) //放大縮小
{
//Matrix matrix = new Matrix();
float scale = detector.getScaleFactor(); //縮放倍率
matrix.postScale( scale,scale,mid.x,mid.y);
//matrix.postScale( scale,scale,detector.getFocusX(),detector.getFocusY());
//matrix.setTranslate(0,(dh-(bmpHeight*scale))/2);//圖片位置
synchronized(sfv.getHolder())
{
Canvas canvas = sfv.getHolder().lockCanvas();
canvas.drawColor(Color.BLACK);
canvas.concat(matrix);
canvas.drawBitmap(bitmap, matrix, null);
sfv.getHolder().unlockCanvasAndPost(canvas);
}
return true;
}
@Override
public boolean onScaleBegin(ScaleGestureDetector detector)
{
return true; //返回true才會進入onScale()
}
@Override
public void onScaleEnd(ScaleGestureDetector detector)
{
}
}
public byte[] readFully(InputStream input) throws IOException
{
byte[] buffer = new byte[8192];
int bytesRead;
ByteArrayOutputStream output = new ByteArrayOutputStream();
while ((bytesRead = input.read(buffer)) != -1)
{
output.write(buffer, 0, bytesRead);
}
input.close();
return output.toByteArray();
}
}
複製代碼
以上是程式碼
在縮放地方 每次放大前都會先縮小
然後圖片會一直跑到下方
有時候放大之後就不見了@@
請問我是哪裡寫錯了嗎??
還有移動圖片的地方
沒有辦法點擊圖片移動
變成點空白處
圖片會移到那
該怎麼修改才對呢??
希望大家可以幫幫忙><
歡迎光臨 Android 台灣中文網 (https://apk.tw/)
Powered by Discuz! X3.1