Android輪播圖點(diǎn)擊圖片放大效果的實(shí)現(xiàn)方法
前言
最近項(xiàng)目中需要實(shí)現(xiàn)輪播圖顯示商品圖片,當(dāng)用戶點(diǎn)擊商品圖片的時(shí)候,需要圖片放大顯示,當(dāng)然用戶還能進(jìn)行多張圖片的滑動(dòng)切換,放大,縮小圖片等操作,實(shí)現(xiàn)起來相對(duì)還是比較簡(jiǎn)單的,話不多說,咱們是用代碼說話的,直接上代碼。
實(shí)現(xiàn)步驟:
1.效果圖的展示
2.項(xiàng)目中添加相關(guān)的依賴
3.主界面實(shí)現(xiàn)輪播圖的效果
4.點(diǎn)擊輪播圖進(jìn)入圖片放大展示頁面
5.圖片放大展示頁面所需的適配器
6.獲取fragment需要展示圖片的url
7.圖片縮放時(shí)遇到Bug解決
實(shí)現(xiàn)過程:
1.效果圖的展示
2.項(xiàng)目中添加相關(guān)的依賴
implementation 'com.youth.banner:banner:1.4.9' implementation 'com.github.bumptech.glide:glide:4.5.0' implementation 'com.commit451:PhotoView:1.2.4'
3.主界面實(shí)現(xiàn)輪播圖的效果
public class MainActivity extends AppCompatActivity implements OnBannerListener { private Banner banner; private ArrayList<String> list_path; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initView(); initData(); initListener(); } private void initView() { banner = findViewById(R.id.banner); } private void initData() { setBanner();//設(shè)置輪播圖 } private void initListener() { } /** * 設(shè)置輪播圖 */ private void setBanner() { //放圖片地址的集合 list_path = new ArrayList<>(); //設(shè)置圖片數(shù)據(jù) list_path.add("https://sami-1256315447.picgz.myqcloud.com/article/201908/2a919def19fc47e3aa0d75d8c227ab1b.jpg"); list_path.add("https://sami-1256315447.picgz.myqcloud.com/article/201908/d027d1efc0564c44bb979ba0bd21f560.jpg"); list_path.add("https://sami-1256315447.picgz.myqcloud.com/article/201908/bbb930d66e5a48baa8d3c143544d7631.jpg"); list_path.add("https://sami-1256315447.picgz.myqcloud.com/article/201908/fb1721b8c9be4da9949fcdd26fc902a2.jpg"); list_path.add("https://sami-1256315447.picgz.myqcloud.com/article/201908/08b58dde9b284638b44e2d03c4cb9acf.jpg"); list_path.add("https://sami-1256315447.picgz.myqcloud.com/article/201908/d3caeb6129ee43df87f5c1e1058d96fc.jpg"); list_path.add("https://sami-1256315447.picgz.myqcloud.com/article/201908/9fd01c4add07473db31ba850f20a7232.jpg"); list_path.add("http://a.hiphotos.baidu.com/image/pic/item/00e93901213fb80e3b0a611d3fd12f2eb8389424.jpg"); //設(shè)置內(nèi)置樣式,共有六種可以點(diǎn)入方法內(nèi)逐一體驗(yàn)使用。 banner.setBannerStyle(BannerConfig.NUM_INDICATOR); //設(shè)置圖片加載器,圖片加載器在下方 banner.setImageLoader(new ImgLoader()); //設(shè)置圖片網(wǎng)址或地址的集合 banner.setImages(list_path); //設(shè)置輪播的動(dòng)畫效果,內(nèi)含多種特效,可點(diǎn)入方法內(nèi)查找后內(nèi)逐一體驗(yàn) banner.setBannerAnimation(Transformer.Default); //設(shè)置輪播間隔時(shí)間 banner.setDelayTime(3000); //設(shè)置是否為自動(dòng)輪播,默認(rèn)是“是” banner.isAutoPlay(true); //設(shè)置指示器的位置,小點(diǎn)點(diǎn),左中右。 banner.setIndicatorGravity(BannerConfig.CENTER) //以上內(nèi)容都可寫成鏈?zhǔn)讲季?,這是輪播圖的監(jiān)聽。比較重要。方法在下面。 .setOnBannerListener(this) //必須最后調(diào)用的方法,啟動(dòng)輪播圖。 .start(); } //輪播圖的監(jiān)聽方法 @Override public void OnBannerClick(int position) { Intent intent = new Intent(this, BigImgActivity.class); intent.putStringArrayListExtra("imgData", list_path); intent.putExtra("clickPosition", position); startActivity(intent); } //自定義的圖片加載器 private class ImgLoader extends ImageLoader { @Override public void displayImage(Context context, Object path, ImageView imageView) { Glide.with(context).load((String) path).into(imageView); } } }
4.點(diǎn)擊輪播圖進(jìn)入圖片放大展示頁面
public class BigImgActivity extends AppCompatActivity { private ViewPagerFixed viewPager; private TextView tvNum; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_big_img); initView(); } private void initView() { viewPager = findViewById(R.id.viewpager); tvNum = findViewById(R.id.tv_num); //接收?qǐng)D片數(shù)據(jù)及位置 final ArrayList<String> imgData = getIntent().getStringArrayListExtra("imgData"); int clickPosition = getIntent().getIntExtra("clickPosition", 0); //添加適配器 PhotoPagerAdapter viewPagerAdapter = new PhotoPagerAdapter(getSupportFragmentManager(), imgData); viewPager.setAdapter(viewPagerAdapter); viewPager.setCurrentItem(clickPosition);//設(shè)置選中圖片位置 viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() { @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { tvNum.setText(String.valueOf(position + 1) + "/" + imgData.size()); } @Override public void onPageSelected(int position) { } @Override public void onPageScrollStateChanged(int state) { } }); } }
5.圖片放大展示頁面所需的適配器
/** * 滑動(dòng)圖片ViewPager適配器 */ public class PhotoPagerAdapter extends FragmentPagerAdapter { private final ArrayList<String> urlList; public PhotoPagerAdapter(FragmentManager fm, ArrayList<String> urlList) { super(fm); this.urlList=urlList; } @Override public Fragment getItem(int position) { return PhotoFragment.newInstance(urlList.get(position)); } @Override public int getCount() { return urlList.size(); } }
6.獲取fragment需要展示圖片的url
public class PhotoFragment extends Fragment { private String url; private PhotoView mPhotoView; /** * 獲取這個(gè)fragment需要展示圖片的url * * @param url * @return */ public static PhotoFragment newInstance(String url) { PhotoFragment fragment = new PhotoFragment(); Bundle args = new Bundle(); args.putString("url", url); fragment.setArguments(args); return fragment; } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); url = getArguments().getString("url"); } @Nullable @Override public View onCreateView(LayoutInflater inflater, final ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.fragment_img, container, false); mPhotoView = view.findViewById(R.id.photoview); //設(shè)置縮放類型,默認(rèn)ScaleType.CENTER(可以不設(shè)置) // mPhotoView.setScaleType(ImageView.ScaleType.CENTER); //長(zhǎng)按事件 mPhotoView.setOnLongClickListener(new View.OnLongClickListener() { @Override public boolean onLongClick(View view) { //Toast.makeText(getActivity(), "長(zhǎng)按事件", Toast.LENGTH_SHORT).show(); return true; } }); //點(diǎn)擊事件 mPhotoView.setOnPhotoTapListener(new PhotoViewAttacher.OnPhotoTapListener() { @Override public void onPhotoTap(View view, float x, float y) { //Toast.makeText(getActivity(), "點(diǎn)擊事件,真實(shí)項(xiàng)目中可關(guān)閉activity", Toast.LENGTH_SHORT).show(); getActivity().finish(); } }); Glide.with(getContext()) .load(url) // .placeholder(R.mipmap.ic_launcher)//加載過程中圖片未顯示時(shí)顯示的本地圖片 // .error(R.mipmap.ic_launcher)//加載異常時(shí)顯示的圖片 //.centerCrop()//圖片圖填充ImageView設(shè)置的大小 // .fitCenter()//縮放圖像測(cè)量出來等于或小于ImageView的邊界范圍,該圖像將會(huì)完全顯示 .into(mPhotoView); return view; } }
7.圖片縮放時(shí)遇到Bug解決
在測(cè)試的過程中,對(duì)放大的圖片進(jìn)行縮放的時(shí)候,遇到下面的Bug:
java.lang.IllegalArgumentException: pointerIndex out of range
在做多點(diǎn)觸控放大縮小,操作自己所繪制的圖形時(shí)發(fā)生這個(gè)異常,如果是操作圖片的放大縮小多點(diǎn)觸控不會(huì)出現(xiàn)這個(gè)錯(cuò)誤
這個(gè)bug是Android系統(tǒng)原因 。
問題解決方案:
自定義ViewPager,重寫onTouchEvent 和onInterceptTouchEvent
public class ViewPagerFixed extends android.support.v4.view.ViewPager { public ViewPagerFixed(Context context) { super(context); } public ViewPagerFixed(Context context, AttributeSet attrs) { super(context, attrs); } @Override public boolean onTouchEvent(MotionEvent ev) { try { return super.onTouchEvent(ev); } catch (IllegalArgumentException ex) { ex.printStackTrace(); } return false; } @Override public boolean onInterceptTouchEvent(MotionEvent ev) { try { return super.onInterceptTouchEvent(ev); } catch (IllegalArgumentException ex) { ex.printStackTrace(); } return false; } }
布局文件:
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:background="#fff"> <com.showly.testimagedemo.view.ViewPagerFixed android:id="@+id/viewpager" android:layout_width="match_parent" android:layout_height="match_parent" /> <TextView android:id="@+id/tv_num" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerHorizontal="true" android:textColor="#ffffff" android:textSize="30sp" /> </RelativeLayout>
實(shí)現(xiàn)過程就這樣完成了。
需要Demo源碼:點(diǎn)擊這里。
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,謝謝大家對(duì)腳本之家的支持。
- Android基于AdapterViewFlipper實(shí)現(xiàn)的圖片/文字輪播動(dòng)畫控件
- Android實(shí)現(xiàn)背景圖片輪播
- Android實(shí)現(xiàn)圖片輪播列表
- 詳解android 視頻圖片混合輪播實(shí)現(xiàn)
- Android開發(fā)實(shí)現(xiàn)的自動(dòng)換圖片、輪播圖效果示例
- Android實(shí)現(xiàn)輪播圖片展示效果
- Android自定義圖片輪播Banner控件使用解析
- Android高級(jí)圖片滾動(dòng)控件實(shí)現(xiàn)3D版圖片輪播器
- Android開發(fā)使用Handler的PostDelayed方法實(shí)現(xiàn)圖片輪播功能
- 用AdapterViewFlipper輕松完成圖片輪播
相關(guān)文章
Android GuideView實(shí)現(xiàn)首次登陸引導(dǎo)
這篇文章主要為大家詳細(xì)介紹了Android GuideView實(shí)現(xiàn)首次登陸引導(dǎo),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-03-03android 中ProgressDialog實(shí)現(xiàn)全屏效果的示例
本篇文章主要介紹了android 中ProgressDialog實(shí)現(xiàn)全屏效果的示例,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-11-11Android 購物車加減功能的實(shí)現(xiàn)代碼
這篇文章主要介紹了Android 實(shí)現(xiàn)購物車加減功能,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-04-04android 9.0 launcher3 去掉抽屜式顯示所有 app(代碼詳解)
本文通過實(shí)例代碼給大家介紹了android 9.0 Launcher3 去掉抽屜式,顯示所有 app,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-11-11Android基于PhotoView實(shí)現(xiàn)的頭像/圓形裁剪控件
這篇文章主要給大家介紹了關(guān)于Android基于PhotoView實(shí)現(xiàn)的頭像/圓形裁剪控件的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2018-07-07