国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 系統(tǒng) > Android > 正文

Android實(shí)現(xiàn)圖片點(diǎn)擊預(yù)覽效果(zoom動(dòng)畫)

2019-12-12 03:19:21
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

參考:https://developer.android.google.cn/training/animation/zoom.html

1.創(chuàng)建Views

下面的布局包括了你想要zoom的大版本和小版本的view。

1.ImageButton是小版本的,能點(diǎn)擊的,點(diǎn)擊后顯示大版本的ImageView。

2.ImageView是大版本的,可以顯示ImageButton點(diǎn)擊后的樣式。

3.ImageView一開始是不可見的(invisible),當(dāng)ImageButton點(diǎn)擊后,它會(huì)實(shí)現(xiàn)zoom動(dòng)畫,就像從ImageButton上擴(kuò)大顯示出來(lái)。

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/container" android:layout_width="match_parent" android:layout_height="match_parent"> <LinearLayout android:layout_width="match_parent"  android:layout_height="wrap_content"  android:orientation="vertical"  android:padding="16dp">  <ImageButton   android:id="@+id/thumb_button_1"   android:layout_width="100dp"   android:layout_height="75dp"   android:layout_marginRight="1dp"   android:src="@drawable/thumb1"   android:scaleType="centerCrop"android:contentDescription="@string/description_image_1" /> </LinearLayout> <!-- 這個(gè)不可見的ImageView持有上面的ImageButton zoom后的圖片版本。 動(dòng)畫沒(méi)有發(fā)生之前,它占據(jù)了整個(gè)屏幕。動(dòng)畫開始,這個(gè)View從上面 ImageButton的范圍變化到他自己最終的范圍。   --> <ImageView  android:id="@+id/expanded_image"  android:layout_width="match_parent"  android:layout_height="match_parent"  android:visibility="invisible"android:contentDescription="@string/description_zoom_touch_close" /></FrameLayout>

2.設(shè)置zoom動(dòng)畫

  在ImageButton上設(shè)置點(diǎn)擊事件,執(zhí)行zoom動(dòng)畫

public class ZoomActivity extends FragmentActivity { // 保存下當(dāng)前動(dòng)畫類,以便可以隨時(shí)結(jié)束動(dòng)畫 private Animator mCurrentAnimator; //系統(tǒng)的短時(shí)長(zhǎng)動(dòng)畫持續(xù)時(shí)間(單位ms) // 對(duì)于不易察覺(jué)的動(dòng)畫或者頻繁發(fā)生的動(dòng)畫 // 這個(gè)動(dòng)畫持續(xù)時(shí)間是最理想的 private int mShortAnimationDuration; @Override protected void onCreate(Bundle savedInstanceState) {  super.onCreate(savedInstanceState);  setContentView(R.layout.activity_zoom);  // 給ImageButton設(shè)置點(diǎn)擊事件  final View thumb1View = findViewById(R.id.thumb_button_1);  thumb1View.setOnClickListener(new View.OnClickListener() {   @Override   public void onClick(View view) {  //執(zhí)行zoom動(dòng)畫方法    zoomImageFromThumb(thumb1View, R.drawable.image1);   }  });  //取回系統(tǒng)默認(rèn)的短時(shí)長(zhǎng)動(dòng)畫持續(xù)時(shí)間  mShortAnimationDuration = getResources().getInteger(android.R.integer.config_shortAnimTime); } ...}

3.實(shí)現(xiàn)zoom動(dòng)畫

你需要把從正常大小的view到擴(kuò)大以后的view這個(gè)過(guò)程作成動(dòng)畫。

1.指定想要zoom的圖片給ImageView。(理想情況下,這個(gè)bitmap的大小不應(yīng)該比屏幕大)

2.計(jì)算這個(gè)ImageView的開始和結(jié)束位置

3.把四個(gè)點(diǎn)和縮放大小的屬性同時(shí)作成動(dòng)畫,從開始的狀態(tài)到結(jié)束的狀態(tài)。這四個(gè)動(dòng)畫被添加到AnimatorSet中,方便他們同時(shí)執(zhí)行。

4.當(dāng)用戶再次點(diǎn)擊屏幕時(shí),動(dòng)畫要執(zhí)行回去。一樣道理,給ImageView一個(gè)View.OnClickListener,然后隱藏ImageView。

private void zoomImageFromThumb(final View thumbView, int imageResId) { // 如果有動(dòng)畫在執(zhí)行,立即取消,然后執(zhí)行現(xiàn)在這個(gè)動(dòng)畫 if (mCurrentAnimator != null) { mCurrentAnimator.cancel(); } // 加載高分辨率的圖片 final ImageView expandedImageView = (ImageView) findViewById(  R.id.expanded_image); expandedImageView.setImageResource(imageResId); // 計(jì)算開始和結(jié)束位置的圖片范圍 final Rect startBounds = new Rect(); final Rect finalBounds = new Rect(); final Point globalOffset = new Point(); // 開始的范圍就是ImageButton的范圍, // 結(jié)束的范圍是容器(FrameLayout)的范圍 // getGlobalVisibleRect(Rect)得到的是view相對(duì)于整個(gè)硬件屏幕的Rect // 即絕對(duì)坐標(biāo),減去偏移,獲得動(dòng)畫需要的坐標(biāo),即相對(duì)坐標(biāo) // getGlobalVisibleRect(Rect,Point)中,Point獲得的是view在它在 // 父控件上的坐標(biāo)與在屏幕上坐標(biāo)的偏移 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). // 下面這段邏輯其實(shí)就是保持縱橫比 float startScale; // 如果結(jié)束圖片的寬高比比開始圖片的寬高比大 // 就是結(jié)束時(shí)“視覺(jué)上”拉寬了(壓扁了)圖片 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. // 隱藏小的圖片,展示大的圖片。當(dāng)動(dòng)畫開始的時(shí)候, // 要把大的圖片發(fā)在小的圖片的位置上 //小的設(shè)置透明 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. // 再次點(diǎn)擊返回小的圖片,就是上面擴(kuò)大的反向動(dòng)畫。即預(yù)覽完成 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; } });}

以上就是本文的全部?jī)?nèi)容,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作能帶來(lái)一定的幫助,同時(shí)也希望多多支持武林網(wǎng)!

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 达尔| 阳江市| 肥乡县| 阿拉善左旗| 新闻| 巴青县| 临泉县| 辽宁省| 华阴市| 泗洪县| 桐梓县| 阿拉善右旗| 霍山县| 常山县| 阿图什市| 大连市| 灌南县| 六安市| 喀喇| 德保县| 鹿邑县| 来凤县| 周口市| 安义县| 珲春市| 图们市| 修文县| 嵊州市| 和静县| 潍坊市| 碌曲县| 台州市| 广昌县| 海丰县| 沙湾县| 手游| 石楼县| 托克逊县| 合江县| 淮阳县| 金秀|