欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Android仿微信圖片點(diǎn)擊全屏效果

 更新時(shí)間:2020年08月28日 09:34:29   作者:王亟亟  
這篇文章主要為大家詳細(xì)介紹了Android仿微信圖片點(diǎn)擊全屏效果的相關(guān)資料,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

廢話不多說(shuō),先看下Android圖片點(diǎn)擊全屏效果:

先是微信的

再是模仿的

先說(shuō)下實(shí)現(xiàn)原理,再一步步分析

這里總共有2個(gè)Activity一個(gè)就是主頁(yè),一個(gè)就是顯示我們圖片效果的頁(yè)面,參數(shù)通過(guò)Intent傳送,素材內(nèi)容均來(lái)自網(wǎng)絡(luò),(感謝聰明的蘑菇) 圖片都是Glide異步下的,下的,下的重要的事情說(shuō)三次,然后就是用動(dòng)畫(huà)做放大操作然后顯示出來(lái)了(并沒(méi)有做下載原圖的實(shí)現(xiàn),反正也是一樣 下載下來(lái)Set上去而且動(dòng)畫(huà)都不需要更簡(jiǎn)便)。

OK,我們來(lái)看分析下

obj,目錄下分別創(chuàng)建了2個(gè)對(duì)象,一個(gè)用來(lái)使用來(lái)處理顯示頁(yè)面的圖片尺寸信息以及位置信息,還有一個(gè)是用來(lái)附帶URL和分辨率

Config這個(gè)類就是我們的URL了沒(méi)其他什么內(nèi)容。

我們一個(gè)一個(gè)頁(yè)面來(lái)看,先看MainActivity

他做的事情很簡(jiǎn)單,就是把下個(gè)頁(yè)面的一些信息初始化一下然后通過(guò)Intent傳過(guò)去,本身不做什么多余操作

package wjj.com.imitatewechatimage.activity;

import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.ImageView;

import wjj.com.imitatewechatimage.R;

import com.apkfuns.logutils.LogUtils;
import com.bumptech.glide.Glide;

import wjj.com.imitatewechatimage.Config;
import wjj.com.imitatewechatimage.obj.ImageInfoObj;
import wjj.com.imitatewechatimage.obj.ImageWidgetInfoObj;

public class MainActivity extends AppCompatActivity implements View.OnClickListener {
 private ImageView imageView;
 private ImageInfoObj imageInfoObj;
 private ImageWidgetInfoObj imageWidgetInfoObj;

 @Override
 protected void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);
 setContentView(R.layout.activity_main);
 findId();
 init();
 Listener();
 }

 private void findId() {
 imageView = (ImageView) findViewById(R.id.imageView);
 }

 private void init() {
 Glide.with(MainActivity.this).load(Config.IMAGE_URL).placeholder(R.mipmap.maimai).into(imageView);

 imageInfoObj = new ImageInfoObj();
 imageInfoObj.imageUrl = Config.IMAGE_URL;
 imageInfoObj.imageWidth = 1280;
 imageInfoObj.imageHeight = 720;

 imageWidgetInfoObj = new ImageWidgetInfoObj();
 imageWidgetInfoObj.x = imageView.getLeft();
 imageWidgetInfoObj.y = imageView.getTop();
 imageWidgetInfoObj.width = imageView.getLayoutParams().width;
 imageWidgetInfoObj.height = imageView.getLayoutParams().height;

 }

 private void Listener() {
 imageView.setOnClickListener(this);
 }

 @Override
 protected void onResume() {
 super.onResume();
 LogUtils.d("--->MainActivity onResume");
 }

 @Override
 protected void onPause() {
 super.onPause();
 LogUtils.d("--->MainActivity onPause");
 }

 @Override
 protected void onDestroy() {
 super.onDestroy();
 LogUtils.d("--->MainActivity onDestroy");
 }

 @Override
 public void onClick(View v) {
 switch (v.getId()) {
  case R.id.imageView:
  //攜帶參數(shù)跳轉(zhuǎn)
  Intent intent = new Intent(MainActivity.this, howImageActivity.class);
  intent.putExtra("imageInfoObj", imageInfoObj);
  intent.putExtra("imageWidgetInfoObj", imageWidgetInfoObj);
  startActivity(intent);
  break;
  default:
  break;
 }
 }
}

具體業(yè)務(wù)類ShowImageActivity

public class ShowImageActivity extends AppCompatActivity {
 private RelativeLayout MainView;
 private ImageView showImageView;
 private ImageInfoObj imageInfoObj;
 private ImageWidgetInfoObj imageWidgetInfoObj;
 Button button;

 // 屏幕寬度
 public float Width;
 //原圖高
 private float y_img_h;
 // 屏幕高度
 public float Height;
 private float size, size_h, img_w, img_h;
 protected float to_x = 0;
 protected float to_y = 0;
 private float tx;
 private float ty;


 private final Spring spring = SpringSystem
  .create()
  .createSpring()
  .addListener(new ExampleSpringListener());

 @Override
 protected void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);
 setContentView(R.layout.activity_how_image);
 LogUtils.d("--->ShowImageActivity onCreate");
 findId();
 init();
 Listener();
 }

 private void findId() {
 MainView = (RelativeLayout) findViewById(R.id.MainView);
 button = (Button) findViewById(R.id.button);
 }

 private void init() {
 DisplayMetrics dm = getResources().getDisplayMetrics();
 Width = dm.widthPixels;
 Height = dm.heightPixels;

 imageInfoObj = (ImageInfoObj) getIntent().getSerializableExtra("imageInfoObj");
 imageWidgetInfoObj = (ImageWidgetInfoObj) getIntent().getSerializableExtra("imageWidgetInfoObj");
 if (imageInfoObj == null) {
  LogUtils.d("--->imageInfoObj==null");
 }
 if (imageWidgetInfoObj == null) {
  LogUtils.d("--->imageWidgetInfoObj==null");
 }

 showImageView = new ImageView(this);
 showImageView.setScaleType(ImageView.ScaleType.CENTER_CROP);

 Glide.with(ShowImageActivity.this).load(imageInfoObj.imageUrl).into(showImageView);

 img_w = imageWidgetInfoObj.width;
 img_h = imageWidgetInfoObj.height - 300;
 size = Width / img_w;
 y_img_h = imageInfoObj.imageHeight * Width / imageInfoObj.imageWidth;
 size_h = y_img_h / img_h;

 RelativeLayout.LayoutParams p = new RelativeLayout.LayoutParams((int) imageWidgetInfoObj.width,
  (int) imageWidgetInfoObj.height);
 p.addRule(RelativeLayout.CENTER_HORIZONTAL, RelativeLayout.TRUE);
 p.addRule(RelativeLayout.CENTER_VERTICAL, RelativeLayout.TRUE);
 showImageView.setLayoutParams(p);
 p.setMargins((int) imageWidgetInfoObj.x,
  (int) imageWidgetInfoObj.y, (int) (Width - (imageWidgetInfoObj.x + imageWidgetInfoObj.width)),
  (int) (Height - (imageWidgetInfoObj.y + imageWidgetInfoObj.height)));
 MainView.addView(showImageView);

 new Handler().post(new Runnable() {
  public void run() {
  ShowImageView();
  }
 });
 }

 private void Listener() {
 showImageView.setOnClickListener(new View.OnClickListener() {
  @Override
  public void onClick(View v) {
  ShowImageView();
  }
 });

 button.setOnClickListener(new View.OnClickListener() {
  @Override
  public void onClick(View v) {
  ShowImageView();
  }
 });
 }

 @Override
 protected void onResume() {
 super.onResume();
 LogUtils.d("--->ShowImageActivity onResume");
 }

 @Override
 protected void onPause() {
 super.onPause();
 LogUtils.d("--->ShowImageActivity onPause");
 }

 @Override
 protected void onDestroy() {
 super.onDestroy();
 LogUtils.d("--->ShowImageActivity onDestroy");
 }

 private class ExampleSpringListener implements SpringListener {

 @Override
 public void onSpringUpdate(Spring spring) {
  double CurrentValue = spring.getCurrentValue();
  float mappedValue = (float) SpringUtil.mapValueFromRangeToRange(CurrentValue, 0, 1, 1, size);
  float mapy = (float) SpringUtil.mapValueFromRangeToRange(CurrentValue, 0, 1, 1, size_h);
  showImageView.setScaleX(mappedValue);
  showImageView.setScaleY(mapy);
  if (CurrentValue == 1) {
//  showImageView.setVisibility(View.GONE);
  }
 }

 @Override
 public void onSpringAtRest(Spring spring) {

 }

 @Override
 public void onSpringActivate(Spring spring) {

 }

 @Override
 public void onSpringEndStateChange(Spring spring) {

 }
 }

 //實(shí)現(xiàn)效果
 private void MoveView() {

 ObjectAnimator.ofFloat(MainView, "alpha", 0.8f).setDuration(0).start();
 MainView.setVisibility(View.VISIBLE);
 AnimatorSet set = new AnimatorSet();
 set.playTogether(
  ObjectAnimator.ofFloat(showImageView, "translationX", tx).setDuration(200),
  ObjectAnimator.ofFloat(showImageView, "translationY", ty).setDuration(200),
  ObjectAnimator.ofFloat(MainView, "alpha", 1).setDuration(200)

 );
 set.addListener(new Animator.AnimatorListener() {
  @Override
  public void onAnimationStart(Animator animator) {

  }

  @Override
  public void onAnimationEnd(Animator animator) {
  showImageView.setScaleType(ImageView.ScaleType.FIT_XY);
  spring.setEndValue(1);
  }

  @Override
  public void onAnimationCancel(Animator animator) {

  }

  @Override
  public void onAnimationRepeat(Animator animator) {

  }
 });
 set.start();

 }

 //關(guān)閉頁(yè)面
 private void MoveBackView() {
 AnimatorSet set = new AnimatorSet();
 set.playTogether(
  ObjectAnimator.ofFloat(showImageView, "translationX", to_x).setDuration(200),
  ObjectAnimator.ofFloat(showImageView, "translationY", to_y).setDuration(200)
 );
 set.addListener(new Animator.AnimatorListener() {
  @Override
  public void onAnimationStart(Animator animator) {

  }

  @Override
  public void onAnimationEnd(Animator animator) {
  finish();
  }

  @Override
  public void onAnimationCancel(Animator animator) {

  }

  @Override
  public void onAnimationRepeat(Animator animator) {

  }
 });
 set.start();
 }

 //具體動(dòng)畫(huà)處理類
 private void ShowImageView() {
 if (spring.getEndValue() == 0) {
  //彈動(dòng)摩擦力
  spring.setSpringConfig(SpringConfig.fromOrigamiTensionAndFriction(300, 5));
  //動(dòng)畫(huà)結(jié)束后出現(xiàn)的位置
  tx = 0;
  ty = Height / 2 - (imageWidgetInfoObj.y + img_h + 600);
  MoveView();
  return;
 }
 spring.setSpringConfig(SpringConfig.fromOrigamiTensionAndFriction(1, 5));
 spring.setEndValue(0);
 new Handler().post(new Runnable() {
  public void run() {
  MoveBackView();
  }
 });

 }

 @Override
 public boolean onKeyDown(int keyCode, KeyEvent event) {
 if (keyCode == KeyEvent.KEYCODE_BACK) {

  showImageView.setVisibility(View.VISIBLE);
  ShowImageView();

 }
 return true;
 }

}

大致流程:
1.在 init()獲取了屏幕信息,上一個(gè)類傳來(lái)的參數(shù),以及對(duì)坐標(biāo)點(diǎn)進(jìn)行了一些計(jì)算 ,然后用Handler來(lái)啟動(dòng)動(dòng)畫(huà)的效果

2.ShowImageView()處理了動(dòng)畫(huà)的實(shí)現(xiàn),(動(dòng)畫(huà)效果是compile 'com.facebook.rebound:rebound:0.3.8' 實(shí)現(xiàn)的,這邊不做教程了給出傳送門:http://facebook.github.io/rebound/

總結(jié):

總體實(shí)現(xiàn)并不是太難,因?yàn)橛锌蚣艿年P(guān)系,使得復(fù)雜的動(dòng)畫(huà)部分不用自己去寫(xiě),調(diào)用下在回調(diào)里做業(yè)務(wù)就行,這里補(bǔ)充下一些過(guò)程中用到的技術(shù)點(diǎn)

1.圖片的縮放模式:
android:scaleType是控制圖片如何resized/moved來(lái)匹對(duì)ImageView的size。

ImageView.ScaleType / android:scaleType值的意義區(qū)別:

CENTER /center  按圖片的原來(lái)size居中顯示,當(dāng)圖片長(zhǎng)/寬超過(guò)View的長(zhǎng)/寬,則截取圖片的居中部分顯示

CENTER_CROP / centerCrop  按比例擴(kuò)大圖片的size居中顯示,使得圖片長(zhǎng)(寬)等于或大于View的長(zhǎng)(寬)

CENTER_INSIDE / centerInside  將圖片的內(nèi)容完整居中顯示,通過(guò)按比例縮小或原來(lái)的size使得圖片長(zhǎng)/寬等于或小于View的長(zhǎng)/寬

FIT_CENTER / fitCenter  把圖片按比例擴(kuò)大/縮小到View的寬度,居中顯示

FIT_END / fitEnd   把圖片按比例擴(kuò)大/縮小到View的寬度,顯示在View的下部分位置

FIT_START / fitStart  把圖片按比例擴(kuò)大/縮小到View的寬度,顯示在View的上部分位置

FIT_XY / fitXY  把圖片不按比例擴(kuò)大/縮小到View的大小顯示

MATRIX / matrix 用矩陣來(lái)繪制,動(dòng)態(tài)縮小放大圖片來(lái)顯示。

** 要注意一點(diǎn),Drawable文件夾里面的圖片命名是不能大寫(xiě)的

2.Layout常用的屬性:

// 相對(duì)于給定ID控件 
android:layout_above 將該控件的底部置于給定ID的控件之上; 
android:layout_below 將該控件的底部置于給定ID的控件之下; 
android:layout_toLeftOf 將該控件的右邊緣與給定ID的控件左邊緣對(duì)齊; 
android:layout_toRightOf 將該控件的左邊緣與給定ID的控件右邊緣對(duì)齊; 
 
android:layout_alignBaseline 將該控件的baseline與給定ID的baseline對(duì)齊; 
android:layout_alignTop 將該控件的頂部邊緣與給定ID的頂部邊緣對(duì)齊; 
android:layout_alignBottom 將該控件的底部邊緣與給定ID的底部邊緣對(duì)齊; 
android:layout_alignLeft 將該控件的左邊緣與給定ID的左邊緣對(duì)齊; 
android:layout_alignRight 將該控件的右邊緣與給定ID的右邊緣對(duì)齊; 
// 相對(duì)于父組件 
android:layout_alignParentTop 如果為true,將該控件的頂部與其父控件的頂部對(duì)齊; 
android:layout_alignParentBottom 如果為true,將該控件的底部與其父控件的底部對(duì)齊; 
android:layout_alignParentLeft 如果為true,將該控件的左部與其父控件的左部對(duì)齊; 
android:layout_alignParentRight 如果為true,將該控件的右部與其父控件的右部對(duì)齊; 
// 居中 
android:layout_centerHorizontal 如果為true,將該控件的置于水平居中; 
android:layout_centerVertical 如果為true,將該控件的置于垂直居中; 
android:layout_centerInParent 如果為true,將該控件的置于父控件的中央; 
// 指定移動(dòng)像素 
android:layout_marginTop 上偏移的值; 
android:layout_marginBottom 下偏移的值; 
android:layout_marginLeft   左偏移的值; 
android:layout_marginRight   右偏移的值; 

這個(gè)例子只是例子,部分坐標(biāo)和樣式是寫(xiě)死的,如果要運(yùn)用到實(shí)際項(xiàng)目中還是要些許就該,在操作的過(guò)程中還對(duì)加載多圖片進(jìn)行了測(cè)試,暫未發(fā)生OOM的情況,補(bǔ)上內(nèi)存使用情況圖(一直很穩(wěn)定)

這里寫(xiě)圖片描述

代碼地址
源碼下載地址

以上就是本文的全部?jī)?nèi)容,希望能夠幫助大家實(shí)現(xiàn)Android仿微信圖片點(diǎn)擊全屏效果,謝謝大家的閱讀。

相關(guān)文章

最新評(píng)論