綁定帳號登入

Android 台灣中文網

打印 上一主題 下一主題

[求助] canvas的圖片縮放和拖曳

[複製連結] 查看: 3335|回覆: 0|好評: 0
跳轉到指定樓層
樓主
onlyhska | 收聽TA | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
發表於 2014-3-26 17:44

馬上加入Android 台灣中文網,立即免費下載應用遊戲。

您需要 登錄 才可以下載或查看,沒有帳號?註冊

x
本帖最後由 onlyhska 於 2014-3-30 16:23 編輯

  1. public class MainActivity extends Activity {
  2.         Bitmap bitmap,bt;
  3.             ByteBuffer handler ;
  4.             int dw,dh;
  5.             int bmpWidth,bmpHeight;
  6.         SurfaceView sfv;
  7.         boolean flag,lag;
  8.         Thread conn;
  9.         Matrix matrix;
  10.         Paint  mypaint;
  11.         private ScaleGestureDetector mScaleGestureDetector = null;
  12.         float scale;
  13.         PointF mid = new PointF();
  14.          
  15.         @Override
  16.         public void onCreate(Bundle savedInstanceState)
  17.         {
  18.                 super.onCreate(savedInstanceState);
  19.                 setContentView(R.layout.activity_main);
  20.                
  21.                 dw = getWindowManager().getDefaultDisplay().getWidth();//手機螢幕寬度
  22.                 dh = getWindowManager().getDefaultDisplay().getHeight();//手機螢幕高度
  23.         
  24.         
  25.                
  26.                 sfv = (SurfaceView) findViewById(R.id.sfv);
  27.                 mScaleGestureDetector = new ScaleGestureDetector(this,new ScaleGestureListener());
  28.                 sfv.getHolder().addCallback(new Callback()
  29.                 {
  30.                 @Override
  31.                 public void surfaceDestroyed(SurfaceHolder holder)
  32.                 {
  33.                         //停止執行緒
  34.                         flag=false;
  35.                         conn.interrupt();
  36.                         conn=null;                      
  37.                         }
  38.                                        
  39.                         @Override
  40.                         public void surfaceCreated(SurfaceHolder holder)
  41.                         {
  42.                                 conn=new Thread(new Runnable()
  43.                                 {
  44.                                        
  45.                                         public void run()
  46.                                             {
  47.                                                 flag=true;
  48.                                                 try
  49.                                             {
  50.                                             String url="http://172.16.17.39/Media/Snapshot?deviceid=7";
  51.                                             IMGParser parser2 = new IMGParser();
  52.                                             InputStream input=parser2.getIMGFromUrl(url);
  53.                                                                
  54.                                             byte[] data=readFully(input);
  55.                                             bitmap = BitmapFactory.decodeByteArray(data, 0 , data.length);
  56.                                                   
  57.                                             if(!lag)
  58.                                             {
  59.                                                     bmpWidth=bitmap.getWidth();
  60.                                                     bmpHeight=bitmap.getHeight();
  61.                                                    
  62.                                                     scale=(float) (dw/(bmpWidth *1.0));
  63.                                                     matrix=new Matrix();
  64.                                                     matrix.setScale(scale, scale);
  65.                                                     matrix.postTranslate(0,(dh-(bmpHeight*scale))/2);//圖片位置
  66.                                                     lag=true;
  67.                                             }
  68.                                            
  69.                                             synchronized(sfv.getHolder())
  70.                                             {
  71.                                                     Canvas canvas = sfv.getHolder().lockCanvas(); // 加鎖
  72.                                                         //設定Canvas屬性
  73.                                                         canvas.drawColor(Color.BLACK);//設定畫布顏色
  74.                                                         canvas.drawBitmap(bitmap, matrix, null);
  75.                                                         sfv.getHolder().unlockCanvasAndPost(canvas);//解鎖
  76.                                             }
  77.                                             
  78.                                 }
  79.                                     catch (Exception e)
  80.                                 {
  81.                                      e.printStackTrace();
  82.                                 }
  83.                                                
  84.                             }
  85.                         });
  86.                                 conn.start();
  87.                         }
  88.                                        
  89.                         @Override
  90.                         public void surfaceChanged(SurfaceHolder holder, int format, int width,int height)
  91.                         {
  92.                         }
  93.                 });
  94.     }
  95.        
  96.         @Override
  97.     public boolean onTouchEvent(MotionEvent event) //移動
  98.     {            
  99. //                if (event.getAction() == MotionEvent.ACTION_DOWN) {
  100. //
  101. //                        float x = event.getX();
  102. //
  103. //                        float y = event.getY();
  104. //
  105. //            Canvas canvas=sfv.getHolder().lockCanvas();
  106. //            canvas.drawColor(Color.BLACK);
  107. //        //    canvas.drawBitmap(bitmap,x,y,null);
  108. //
  109. //            sfv.getHolder().unlockCanvasAndPost(canvas);
  110. //         }
  111. //                 
  112.             return mScaleGestureDetector.onTouchEvent(event);
  113.    }
  114.          
  115.         public class ScaleGestureListener implements ScaleGestureDetector.OnScaleGestureListener
  116.         {

  117.             @Override
  118.             public boolean onScale(ScaleGestureDetector detector) //放大縮小
  119.             {
  120.                     //Matrix matrix = new Matrix();        
  121.                 float scale = detector.getScaleFactor(); //縮放倍率
  122.                 matrix.postScale( scale,scale,mid.x,mid.y);
  123.                 //matrix.postScale( scale,scale,detector.getFocusX(),detector.getFocusY());
  124.                 //matrix.setTranslate(0,(dh-(bmpHeight*scale))/2);//圖片位置
  125.                 synchronized(sfv.getHolder())
  126.                 {
  127.                         Canvas canvas = sfv.getHolder().lockCanvas();
  128.                         canvas.drawColor(Color.BLACK);
  129.                         canvas.concat(matrix);
  130.                         canvas.drawBitmap(bitmap, matrix, null);
  131.                         sfv.getHolder().unlockCanvasAndPost(canvas);
  132.                 }
  133.                
  134.             
  135.                 return true;
  136.             }
  137.           
  138.                 @Override
  139.             public boolean onScaleBegin(ScaleGestureDetector detector)
  140.             {
  141.                 return true; //返回true才會進入onScale()
  142.             }

  143.            @Override
  144.             public void onScaleEnd(ScaleGestureDetector detector)
  145.             {
  146.                   
  147.             }
  148.             
  149.         }
  150.         public  byte[] readFully(InputStream input) throws IOException
  151.         {
  152.                       
  153.                 byte[] buffer = new byte[8192];
  154.             int bytesRead;
  155.             ByteArrayOutputStream output = new ByteArrayOutputStream();
  156.             while ((bytesRead = input.read(buffer)) != -1)
  157.             {
  158.                 output.write(buffer, 0, bytesRead);
  159.             }
  160.             input.close();
  161.             return output.toByteArray();
  162.          }
  163. }
複製代碼


以上是程式碼

在縮放地方 每次放大前都會先縮小
然後圖片會一直跑到下方
有時候放大之後就不見了@@
請問我是哪裡寫錯了嗎??

還有移動圖片的地方
沒有辦法點擊圖片移動
變成點空白處
圖片會移到那
該怎麼修改才對呢??

希望大家可以幫幫忙><
「用Android 就來APK.TW」,快來加入粉絲吧!
Android 台灣中文網(APK.TW)
收藏收藏 分享分享 分享專題
用Android 就來Android 台灣中文網(https://apk.tw)
回覆

使用道具 舉報

您需要登錄後才可以回帖 登錄 | 註冊

本版積分規則