ImageView+ViewPager+PhotoView實現朋友圈圖片點擊全屏查看支持放大縮小

項目DEMO地址:http://download.csdn.net/detail/wxk105/9562369

效果圖

效果圖

點擊滑動效果圖

點擊滑動效果圖

點擊放大效果圖

點擊放大效果圖

mainActivity


項目簡單隻在必要處做聲明,完整demo見結尾鏈接,看不懂請加Q164454216,驗證:博客

public class MainActivity extends AppCompatActivity {
    private List<ImageInfo> list;//用於接收後臺圖片地址集合
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
         initData();//填充數據
        initView();//初始化控件
    }

    private void initData() {
        for (int i=0;i<urls.length;i++){
            ImageInfo imageInfo=new ImageInfo(urls[i],200,200);
            list.add(imageInfo);
        }
    }

    private void initView() {
        GridView gv_pic = (GridView) findViewById(R.id.gv_pic);
        gv_pic.setAdapter(new GvAdapter(this));
        gv_pic.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                list=new ArrayList<ImageInfo>();
                //點擊位置及對象傳入dialog
                PicShowDialog dialog=new PicShowDialog(MainActivity.this,list,position);
                dialog.show();
            }
        });
    }
}

PicShowDialog用於圖片展示dialog

public class PicShowDialog extends Dialog {
    private Context context;
    private View view;
    private List<ImageInfo> imageInfos;//接收傳入集合
    private MyViewPager vp;
    private List<View> views = new ArrayList<View>();//圖片上圓點集合
    private LayoutAnimationController lac;
    private LinearLayout ll_point;
    private ViewPagerAdapter pageAdapter;
    private int position;//點擊位置
    private LinearLayout.LayoutParams paramsL = new LinearLayout.LayoutParams(10, 10);
    // 圖片緩存 默認 等
    private DisplayImageOptions optionsImag = new DisplayImageOptions.Builder()
            .showImageForEmptyUri(R.mipmap.zanwutupian)
            .showImageOnFail(R.mipmap.zanwutupian).cacheInMemory(true).cacheOnDisk(true)
            .considerExifParams(true).imageScaleType(ImageScaleType.EXACTLY)
            .bitmapConfig(Bitmap.Config.RGB_565).build();

    public PicShowDialog(Context context, int themeResId) {
        super(context, themeResId);
        this.context = context;
    }


    public PicShowDialog(Context context, List<ImageInfo> imageInfos, int position) {
        this(context, R.style.Pic_Dialog);
        this.imageInfos = imageInfos;
        this.position = position;
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.act_dialog_pic);
        getWindow().setLayout(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT);
//        getWindow().setLayout(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN);
        vp = (MyViewPager) findViewById(R.id.vp);
        ll_point = (LinearLayout) findViewById(R.id.ll_point);
//        init();
        initMyPageAdapter();
//        vp.setAdapter(new ViewPagerAdapter());
        vp.setCurrentItem(position);
        //滑動監聽設置圖片滑動時,相應點跟着變化
        vp.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {
            @Override
            public void onPageScrolled(int i, float v, int i1) {

            }

            @Override
            public void onPageSelected(int position) {
                if (views.size() != 0 && views.get(position) != null) {

                    for (int i = 0; i < views.size(); i++) {
                        if (i == position) {
                            views.get(i).setBackgroundResource(R.drawable.point_focus2);
                        } else {
                            views.get(i).setBackgroundResource(R.drawable.point_normal2);
                        }
                    }

                }
            }

            @Override
            public void onPageScrollStateChanged(int i) {

            }
        });

    }
    /***
     * 初始化viewpager適配器
     */

    private void initMyPageAdapter() {
        initPoint();
        if (pageAdapter == null) {
            pageAdapter = new ViewPagerAdapter();
            if (vp != null) {
                vp.setAdapter(pageAdapter);
            }

        } else {
            pageAdapter.notifyDataSetChanged();
        }
    }

//初始化圓點
    private void initPoint() {
        views.clear();
        ll_point.removeAllViews();
        if (imageInfos.size()==1){
            ll_point.setVisibility(View.GONE);
        }else {
            for (int i = 0; i < imageInfos.size(); i++) {
                View view = new View(context);
                paramsL.setMargins(dip2px(context, 5), dip2px(context, 2), 0, dip2px(context, 5));
                view.setLayoutParams(paramsL);
                if (i == position) {
                    view.setBackgroundResource(R.drawable.point_focus2);
                } else {
                    view.setBackgroundResource(R.drawable.point_normal2);
                }

                views.add(view);
                ll_point.addView(view);
            }
        }

    }

//viewpager適配器
    private class ViewPagerAdapter extends PagerAdapter {


        @Override
        public int getCount() {
            return imageInfos.size();
        }

        @Override
        public boolean isViewFromObject(View view, Object object) {
            return view == object;
        }

        @Override
        public Object instantiateItem(ViewGroup container, int position) {
            View view =View.inflate(context, R.layout.item_pic_show, null);
            PhotoView photoView = (PhotoView) view.findViewById(R.id.pic_pv);

//這裏使用Imageloader加載框架,加載網絡圖片,圖片地址給的是網絡圖片。            ImageLoader.getInstance().displayImage(imageInfos.get(position).getUrl(),photoView,optionsImag);
            photoView.setOnPhotoTapListener(new PhotoViewAttacher.OnPhotoTapListener() {
                @Override
                public void onPhotoTap(View view, float x, float y) {
                    dismiss();
                }
            });
                    ((ViewPager) container).addView(view);
            return view;
        }

        @Override
        public void destroyItem(ViewGroup container, int position, Object object) {
            ((ViewPager) container).removeView((View) object);
        }
    }
        private   int dip2px(Context context, float dpValue) {
        final float scale = context.getResources().getDisplayMetrics().density;
        return (int) (dpValue * scale + 0.5f);
    }

}

GridView適配器GvAdapter

public class GvAdapter extends BaseAdapter {
    private Context context;
    private List<ImageInfo> list;
    // 圖片緩存 默認 等
    private DisplayImageOptions optionsImag = new DisplayImageOptions.Builder()
            .showImageForEmptyUri(R.mipmap.zanwutupian)
            .showImageOnFail(R.mipmap.zanwutupian).cacheInMemory(true).cacheOnDisk(true)
            .considerExifParams(true).imageScaleType(ImageScaleType.EXACTLY)
            .bitmapConfig(Bitmap.Config.RGB_565).build();
    public GvAdapter(Context context, List<ImageInfo> list){
        this.context=context;
        this.list=list;
    }
    @Override
    public int getCount() {
        return list==null?0:list.size();
    }

    @Override
    public Object getItem(int position) {
        return list.get(position);
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        convertView=View.inflate(context, R.layout.item_image_view, null);
        ImageView iv_image= (ImageView) convertView.findViewById(R.id.iv_image);
        ImageLoader.getInstance().displayImage(list.get(position).getUrl(),iv_image,optionsImag);
        return convertView;
    }
}

項目DEMO地址:http://download.csdn.net/detail/wxk105/9562369可進羣下載:573239233

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章