2016-06-30 7 views
0

私は、縦向きの線形レイアウトに横長の画像を埋め込んでいます。ズームした画像をスクロールする方法は?

問題は、画像が垂直方向に非常に小さく見えるため、ズーム方法をdev.androidから使用したことです。

イメージは元の寸法で表示されますが、電話機の画面よりも大きくなります。したがって、ユーザは画像の一部しか見ることができない。ズームインしているときに、ユーザーが画像の左右にスクロールできるようにするにはどうすればよいですか?

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_insane1x1); 
    ActionBar actionBar = getSupportActionBar(); 
    actionBar.hide(); 

    final View thumb1View = findViewById(R.id.imageView1); 
    thumb1View.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      zoomImageFromThumb(thumb1View, R.drawable.i1x1); 
     } 
    }); 

    // Retrieve and cache the system's default "short" animation time. 
    mShortAnimationDuration = getResources().getInteger(
      android.R.integer.config_shortAnimTime); 

} 


private void zoomImageFromThumb(final View thumbView, int imageResId) { 
    // If there's an animation in progress, cancel it immediately and proceed with this one. 
    if (mCurrentAnimator != null) { 
     mCurrentAnimator.cancel(); 
    } 

    // Load the high-resolution "zoomed-in" image. 
    final ImageView expandedImageView = (ImageView) findViewById(R.id.expanded_image); 
    expandedImageView.setImageResource(imageResId); 

    // Calculate the starting and ending bounds for the zoomed-in image. This step 
    // involves lots of math. Yay, math. 
    final Rect startBounds = new Rect(); 
    final Rect finalBounds = new Rect(); 
    final Point globalOffset = new Point(); 

    // The start bounds are the global visible rectangle of the thumbnail, and the 
    // final bounds are the global visible rectangle of the container view. Also 
    // set the container view's offset as the origin for the bounds, since that's 
    // the origin for the positioning animation properties (X, Y). 
    thumbView.getGlobalVisibleRect(startBounds); 
    findViewById(R.id.container).getGlobalVisibleRect(finalBounds, globalOffset); 
    startBounds.offset(-globalOffset.x, -globalOffset.y); 
    finalBounds.offset(-globalOffset.x, -globalOffset.y); 

    // Adjust the start bounds to be the same aspect ratio as the final bounds using the 
    // "center crop" technique. This prevents undesirable stretching during the animation. 
    // Also calculate the start scaling factor (the end scaling factor is always 1.0). 
    float startScale; 
    if ((float) finalBounds.width()/finalBounds.height() 
      > (float) startBounds.width()/startBounds.height()) { 
     // Extend start bounds horizontally 
     startScale = (float) startBounds.height()/finalBounds.height(); 
     float startWidth = startScale * finalBounds.width(); 
     float deltaWidth = (startWidth - startBounds.width())/2; 
     startBounds.left -= deltaWidth; 
     startBounds.right += deltaWidth; 
    } else { 
     // Extend start bounds vertically 
     startScale = (float) startBounds.width()/finalBounds.width(); 
     float startHeight = startScale * finalBounds.height(); 
     float deltaHeight = (startHeight - startBounds.height())/2; 
     startBounds.top -= deltaHeight; 
     startBounds.bottom += deltaHeight; 
    } 

    // Hide the thumbnail and show the zoomed-in view. When the animation begins, 
    // it will position the zoomed-in view in the place of the thumbnail. 
    thumbView.setAlpha(0f); 
    expandedImageView.setVisibility(View.VISIBLE); 

    // Set the pivot point for SCALE_X and SCALE_Y transformations to the top-left corner of 
    // the zoomed-in view (the default is the center of the view). 
    expandedImageView.setPivotX(0f); 
    expandedImageView.setPivotY(0f); 

    // Construct and run the parallel animation of the four translation and scale properties 
    // (X, Y, SCALE_X, and SCALE_Y). 
    AnimatorSet set = new AnimatorSet(); 
    set 
      .play(ObjectAnimator.ofFloat(expandedImageView, View.X, startBounds.left, 
        finalBounds.left)) 
      .with(ObjectAnimator.ofFloat(expandedImageView, View.Y, startBounds.top, 
        finalBounds.top)) 
      .with(ObjectAnimator.ofFloat(expandedImageView, View.SCALE_X, startScale, 1f)) 
      .with(ObjectAnimator.ofFloat(expandedImageView, View.SCALE_Y, startScale, 1f)); 
    set.setDuration(mShortAnimationDuration); 
    set.setInterpolator(new DecelerateInterpolator()); 
    set.addListener(new AnimatorListenerAdapter() { 
     @Override 
     public void onAnimationEnd(Animator animation) { 
      mCurrentAnimator = null; 
     } 

     @Override 
     public void onAnimationCancel(Animator animation) { 
      mCurrentAnimator = null; 
     } 
    }); 
    set.start(); 
    mCurrentAnimator = set; 

    // Upon clicking the zoomed-in image, it should zoom back down to the original bounds 
    // and show the thumbnail instead of the expanded image. 
    final float startScaleFinal = startScale; 
    expandedImageView.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      if (mCurrentAnimator != null) { 
       mCurrentAnimator.cancel(); 
      } 

      // Animate the four positioning/sizing properties in parallel, back to their 
      // original values. 
      AnimatorSet set = new AnimatorSet(); 
      set 
        .play(ObjectAnimator.ofFloat(expandedImageView, View.X, startBounds.left)) 
        .with(ObjectAnimator.ofFloat(expandedImageView, View.Y, startBounds.top)) 
        .with(ObjectAnimator 
          .ofFloat(expandedImageView, View.SCALE_X, startScaleFinal)) 
        .with(ObjectAnimator 
          .ofFloat(expandedImageView, View.SCALE_Y, startScaleFinal)); 
      set.setDuration(mShortAnimationDuration); 
      set.setInterpolator(new DecelerateInterpolator()); 
      set.addListener(new AnimatorListenerAdapter() { 
       @Override 
       public void onAnimationEnd(Animator animation) { 
        thumbView.setAlpha(1f); 
        expandedImageView.setVisibility(View.GONE); 
        mCurrentAnimator = null; 
       } 

       @Override 
       public void onAnimationCancel(Animator animation) { 
        thumbView.setAlpha(1f); 
        expandedImageView.setVisibility(View.GONE); 
        mCurrentAnimator = null; 
       } 
      }); 
      set.start(); 
      mCurrentAnimator = set; 
     } 
    }); 
} 

XMLファイル:

<FrameLayout> 

    <ScrollView> 

     <LinearLayout> 
      <ImageButton /> 
     </LinearLayout> 

    </ScrollView> 

    <ImageView> 

</FrameLayout> 

答えて

0

あなたはscrollviewにあなたのImageViewのを追加する必要があります。また、スクロールビューを垂直と水平の両方でスクロール可能にすることを忘れないでください。私はそれが動作すると思います

関連する問題