안 드 로 이 드 윤 방 도 클릭 이미지 증폭 효과 의 실현 방법

머리말
최근 프로젝트 에 서 는 라운드 맵 으로 상품 이미 지 를 표시 해 야 합 니 다.사용자 가 상품 이미 지 를 클릭 할 때 이미지 확대 디 스 플레이 가 필요 합 니 다.물론 사용 자 는 여러 장의 이미지 의 미끄럼 전환,확대,이미지 축소 등 작업 을 할 수 있 습 니 다.실현 하기 가 상대 적 으로 간단 합 니 다.말 은 많 지 않 습 니 다.우 리 는 코드 로 말 하고 코드 를 직접 올 릴 수 있 습 니 다.
실현 절차:
1.효과 도 전시
2.항목 에 의존 도 추가
3.메 인 화면 에서 라운드 맵 의 효 과 를 실현 한다.
4.윤 방 도 를 클릭 하여 확대 전시 페이지 에 들 어가 기
5.그림 확대 전시 페이지 에 필요 한 어댑터
6.fragment 를 가 져 오 려 면 그림 을 보 여 줘 야 할 url
7.그림 크기 조정 중 버그 해결
실현 과정:
1.효과 도 전시

2.항목 에 의존 도 추가

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.메 인 화면 에서 라운드 맵 의 효 과 를 실현 한다.

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();//     
}

private void initListener() {

}

/**
*      
*/
private void setBanner() {
//        
list_path = new ArrayList<>();
//      
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");

//      ,                 。
banner.setBannerStyle(BannerConfig.NUM_INDICATOR);
//       ,        
banner.setImageLoader(new ImgLoader());
//            
banner.setImages(list_path);
//         ,      ,              
banner.setBannerAnimation(Transformer.Default);
//        
banner.setDelayTime(3000);
//         ,   “ ”
banner.isAutoPlay(true);
//        ,   ,   。
banner.setIndicatorGravity(BannerConfig.CENTER)
//            ,        。    。     。
.setOnBannerListener(this)
//         ,     。
.start();
}

//        
@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.윤 방 도 를 클릭 하여 확대 전시 페이지 에 들 어가 기

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);

//         
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);//        

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.그림 확대 전시 페이지 에 필요 한 어댑터

/**
*     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;

/**
*     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);
//      ,  ScaleType.CENTER(     )
// mPhotoView.setScaleType(ImageView.ScaleType.CENTER);

//    
mPhotoView.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View view) {
//Toast.makeText(getActivity(), "    ", Toast.LENGTH_SHORT).show();
return true;
}
});

//    
mPhotoView.setOnPhotoTapListener(new PhotoViewAttacher.OnPhotoTapListener() {
@Override
public void onPhotoTap(View view, float x, float y) {
//Toast.makeText(getActivity(), "    ,        activity", Toast.LENGTH_SHORT).show();
getActivity().finish();
}
});


Glide.with(getContext())
.load(url)
// .placeholder(R.mipmap.ic_launcher)//                  
// .error(R.mipmap.ic_launcher)//          
//.centerCrop()//     ImageView     
// .fitCenter()//             ImageView     ,         
.into(mPhotoView);
return view;
}
}
7.그림 크기 조정 중 버그 해결
테스트 과정 에서 확 대 된 그림 을 크기 조정 할 때 아래 버그 를 만 납 니 다.

java.lang.IllegalArgumentException: pointerIndex out of range

다 중 터치 확대 축 소 를 하고 자신 이 그린 도형 을 조작 할 때 이 이상 이 발생 합 니 다.그림 의 확대 축소 다 중 터치 제어 라면 이 오류 가 발생 하지 않 습 니 다.
이 bug 는 안 드 로 이 드 시스템 의 원인 입 니 다.
문제 해결 방안:
사용자 정의 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>
실현 과정 은 이렇게 완성 되 었 다.
데모 소스 코드 가 필요 합 니 다여 기 를 클릭 하 세 요.
총결산
이상 은 이 글 의 모든 내용 입 니 다.본 고의 내용 이 여러분 의 학습 이나 업무 에 어느 정도 참고 학습 가 치 를 가지 기 를 바 랍 니 다.여러분 의 저희 에 대한 지지 에 감 사 드 립 니 다.

좋은 웹페이지 즐겨찾기