Androidはハイビジョン大図を表示

4596 ワード

の準備を
大きな画像があるとき、携帯電話の画面を超えたときにも、元の解像度をサポートして表示したいと思っています.この文章は、このような機能を実現するために使われています.この文章は主にカスタムViewの知識点に基づいています.大きく分けて次の2つのステップがあります.
  • 切り取り画像の一部のサイズは現在のサイズの
  • に置く.
  • はスライドをサポートする、スライドすると切り取った画像の部分
  • を更新する.
    まず効果を見る
    show.gif
    最初のステップ
    私たちはまずBitmapRegionDecoderというクラスを知っています.このクラスは1枚の画像を操作することができます.もともとBitmapの中の画像を切り取る方法を使いたいと思っていましたが、その後、このクラスがもっといいことに気づきました.次は彼の基本的な使い方です.
    InputStream inputStream = getResources().getAssets().open("world.jpg");
    BitmapRegionDecoder bitmapRegionDecoder = BitmapRegionDecoder.newInstance(inputStream, false);
    BitmapFactory.Options options = new BitmapFactory.Options();
    options.inPreferredConfig = Bitmap.Config.RGB_565;
    Bitmap bitmapDraw = bitmapRegionDecoder.decodeRegion(mRect, mOptions);//mRect             
    

    これで大きな画像の一部を切り取ることができます.この时、少し考えがあるのではないでしょうか.次のステップは、この画像をジェスチャーに従ってスライドさせることをサポートします.それから、画像に表示する必要がある部分を切り取って、Viewの上にレンダリングします.次は続けます.
    ステップ2
    ここで使うスライドジェスチャーツール類GestureDetector、できない仲間たち、私のこのコードを見てみれば、この道理がわかります.
    class MGestureListener implements GestureDetector.OnGestureListener {   
     @Override    public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
            //Logger.i("--------scroll:" + distanceX + "," + distanceY);     
       float left = mRect.left + distanceX;     
       left = left < 0 ? 0 : left;     //       
       float right = mRect.right + distanceX;    
       right = right > bitmapWidth ? bitmapWidth : right; //          
       float top = mRect.top + distanceY;     
       top = top < 0 ? 0 : top;  //     
       float bottom = mRect.bottom + distanceY;      
       bottom = bottom > bitmapHeight ? bitmapHeight : bottom;  //   
    
      //        ,      mRect      
       if (left == 0) {        
        right = getMeasuredWidth();        
       }       
       if (right == bitmapWidth) {           
            left = bitmapWidth - getMeasuredWidth();  
       }        
       if (top == 0) {  
              bottom = getMeasuredHeight();  
       }   
       if (bottom == bitmapHeight) { 
               top = bitmapHeight - getMeasuredHeight();  
       }        
       mRect.left = (int) left;    
       mRect.right = (int) right;        
       mRect.top = (int) top;        
       mRect.bottom = (int) bottom;        
       Logger.e("---------width:" + (right - left) + ",height:" +    (bottom - top));        
       invalidate();        //    View
       return true;    
     }    
     @Override    
     public boolean onDown(MotionEvent e) {       
      return false;    
     }    
     @Override    
     public boolean onFling(MotionEvent e1, MotionEvent e2, float  velocityX, float velocityY) {  
          return false;   
     }    
      @Override  
      public boolean onSingleTapUp(MotionEvent e) {      
        return false;  
      }    
      @Override    
      public void onLongPress(MotionEvent e) {    }   
      @Override    
      public void onShowPress(MotionEvent e) {    }
    }
    

    これを終えて、ビューの初期化時にこのオブジェクトをインスタンス化します.
    mGestureDetector = new GestureDetector(context, new MGestureListener());
    

    またonDrawでの操作も行います
    @Overrideprotected 
    void onDraw(Canvas canvas) {  
      super.onDraw(canvas);   
      bitmapDraw = bitmapRegionDecoder.decodeRegion(mRect, mOptions);   
      canvas.drawBitmap(bitmapDraw, 0, 0, null);
    }
    

    基本的にコアコードはこれだけで、あといくつかありますが、計算するときにも使うので、必要なものがあれば少し覚えておいてください.
    WindowManager manager = (WindowManager) getContext().getSystemService(Context.WINDOW_SERVICE);
    DisplayMetrics metrics = getResources().getDisplayMetrics();
    manager.getDefaultDisplay().getMetrics(metrics);
    screenWidth = metrics.widthPixels;  //      
    screenHeight = metrics.heightPixels; //      
    
    int height=getSupportActionBar().getHeight(); //  toolbar   
    
    //           
    private int getStatusBarHeight() {
            try {
                Class> c = Class.forName("com.android.internal.R$dimen");
                Object obj = c.newInstance();
                Field field = c.getField("status_bar_height");
                int x = Integer.parseInt(field.get(obj).toString());
                return getResources().getDimensionPixelSize(x);
            } catch (Exception e) {
                e.printStackTrace();
            }
            return 0;
        }
    
    //             
     private int getStatusBarHeight(Context context) { 
         int result = 0; 
         int resourceId = context.getResources().getIdentifier("status_bar_height", "dimen", "android"); 
         if (resourceId > 0) { 
               result = context.getResources().getDimensionPixelSize(resourceId); 
         } 
         return result;
     }
    

    よし、これで大成功だ.githubコードアドレス