图片浏览zoom效果

来源:互联网 发布:单片机LED接线 编辑:程序博客网 时间:2024/04/27 07:41
不仅实现了Lollipop中打开新的activity 的zoom效果(根据点击位置逐步展开过渡到新的界面),还实现了一个弹簧效果的ViewPager





public class MainActivity extends FragmentActivity {private Context context;    private GridView gridView;    private ArrayList<Integer> imgList = new ArrayList<>();    private ArrayList<ImageInfo> imgImageInfos = new ArrayList<>();    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        context=this;        imgList.add(0, R.drawable.p1);        imgList.add(1, R.drawable.p2);        imgList.add(2, R.drawable.p3);        imgList.add(3, R.drawable.p4);        imgList.add(4, R.drawable.p1);        imgList.add(5, R.drawable.p2);        imgList.add(6, R.drawable.p3);        imgList.add(7, R.drawable.p4);        imgList.add(8, R.drawable.p1);        gridView = (GridView) findViewById(R.id.gridview);        final ImageAdapter adapter = new ImageAdapter();        gridView.setAdapter(adapter);        gridView.setOnItemClickListener(new AdapterView.OnItemClickListener() {            @Override            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {                Bundle bundle = new Bundle();                bundle.putIntegerArrayList("imgs", imgList);                bundle.putParcelable("info", ((PhotoView) view).getInfo());                bundle.putInt("position", position);                imgImageInfos.clear();                //NOTE:if imgList.size >= the visible count in single screen,i will cause NullPointException                //because item out of screen have been replaced/reused                for(int i = 0; i < imgList.size(); i++){                    imgImageInfos.add(((PhotoView)parent.getChildAt(i)).getInfo());                }                parent.getChildAt(position);                bundle.putParcelableArrayList("infos", imgImageInfos);                getSupportFragmentManager().beginTransaction().replace(R.id.fragment_viewpager, ViewPagerFragment.getInstance(bundle), "ViewPagerFragment")                        .addToBackStack(null).commit();            }        });    }    class ImageAdapter extends BaseAdapter {        @Override        public int getCount() {            return imgList.size();        }        @Override        public Object getItem(int i) {            return imgList.get(i);        }        @Override        public long getItemId(int i) {            return i;        }        @Override        public View getView(int i, View view, ViewGroup viewGroup) {        int size=(int) (getResources().getDisplayMetrics().density * 100);            PhotoView p = new PhotoView(MainActivity.this);            p.setLayoutParams(new AbsListView.LayoutParams(size, size));            p.setScaleType(ImageView.ScaleType.CENTER_CROP);            p.setImageResource(imgList.get(i));            p.touchEnable(false);//disable touch            return p;        }    }}


import java.util.ArrayList;import com.example.testimage.widget.ImageInfo;import com.example.testimage.widget.PhotoView;import com.example.testimage.widget.ReboundViewPager;import android.os.Bundle;import android.support.annotation.Nullable;import android.support.v4.app.Fragment;import android.support.v4.app.FragmentManager;import android.support.v4.view.PagerAdapter;import android.support.v4.view.ViewPager;import android.view.KeyEvent;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import android.view.animation.AccelerateInterpolator;import android.view.animation.AlphaAnimation;import android.view.animation.Animation;import android.widget.TextView;public class ViewPagerFragment extends Fragment{    private ReboundViewPager viewPager;    private TextView  tips; //viewpager indicator    private ArrayList<Integer> imgs;    private ImageInfo imageInfo;    private View mask;//background view    private ArrayList<ImageInfo> imageInfos;    private int position;    public static ViewPagerFragment getInstance(Bundle imgs){        ViewPagerFragment fragment = new ViewPagerFragment();        fragment.setArguments(imgs);        return fragment;    }    @Nullable    @Override    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {        return inflater.inflate(R.layout.fragment_viewpager,null);    }    @Override    public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {        super.onViewCreated(view, savedInstanceState);        viewPager = (ReboundViewPager) view.findViewById(R.id.viewpager);        tips = (TextView) view.findViewById(R.id.text);        mask = view.findViewById(R.id.mask);        runEnterAnimation();        Bundle bundle = getArguments();        imgs = bundle.getIntegerArrayList("imgs");        imageInfo = bundle.getParcelable("info");        imageInfos = bundle.getParcelableArrayList("infos");        position = bundle.getInt("position", 0);        tips.setText((position + 1) + "/" + imgs.size());        viewPager.getOverscrollView().setAdapter(new PagerAdapter() {            @Override            public int getCount() {                return imgs.size();            }            @Override            public boolean isViewFromObject(View view, Object object) {                return view == object;            }            @Override            public Object instantiateItem(ViewGroup container, int pos) {                PhotoView view = new PhotoView(getActivity());                view.touchEnable(true);                view.setImageResource(imgs.get(pos));                if(position == pos){//only animate when position equals u click in pre layout                    view.animateFrom(imageInfo);                }                //force to get focal point,to listen key listener                view.setFocusableInTouchMode(true);                view.requestFocus();                view.setOnKeyListener(pressKeyListener);//add key listener to listen back press                view.setOnClickListener(onClickListener);                view.setTag(pos);                container.addView(view);                return view;            }            @Override            public void destroyItem(ViewGroup container, int position, Object object) {                container.removeView((View) object);            }        });        viewPager.getOverscrollView().addOnPageChangeListener(new ViewPager.OnPageChangeListener() {            @Override            public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {            }            @Override            public void onPageSelected(int position) {                tips.setText((position + 1) + "/" + imgs.size());            }            @Override            public void onPageScrollStateChanged(int state) {            }        });        //set current position        viewPager.getOverscrollView().setCurrentItem(position);    }    private View.OnClickListener onClickListener = new View.OnClickListener() {        @Override        public void onClick(View v) {            exitFragment(v);        }    };    private void exitFragment(View v) {        //退出时点击的位置        int position = (int) v.getTag();        //回到上个界面该view的位置        runExitAnimation(v);        ((PhotoView)v).animateTo(imageInfos.get(position), new Runnable() {            @Override            public void run() {                if (!ViewPagerFragment.this.isResumed()) {//fragment被回收                    return;                }                final FragmentManager fragmentManager = getFragmentManager();                if (fragmentManager != null) {                    fragmentManager.popBackStack();//回退栈                }            }        });    }    private View.OnKeyListener pressKeyListener = new View.OnKeyListener() {        @Override        public boolean onKey(View v, int keyCode, KeyEvent event) {            if (keyCode == KeyEvent.KEYCODE_BACK) {//只监听返回键                if (event.getAction() != KeyEvent.ACTION_UP) {                    return true;                }                exitFragment(v);                return true;            }            return false;        }    };    private void runEnterAnimation() {        AlphaAnimation alphaAnimation = new AlphaAnimation(0,1);        alphaAnimation.setDuration(300);        alphaAnimation.setInterpolator(new AccelerateInterpolator());        mask.startAnimation(alphaAnimation);    }    public void runExitAnimation(final View view) {        AlphaAnimation alphaAnimation = new AlphaAnimation(1,0);        alphaAnimation.setDuration(300);        alphaAnimation.setInterpolator(new AccelerateInterpolator());        alphaAnimation.setAnimationListener(new Animation.AnimationListener() {            @Override            public void onAnimationStart(Animation animation) {            }            @Override            public void onAnimationEnd(Animation animation) {                mask.setVisibility(View.GONE);                view.setVisibility(View.GONE);            }            @Override            public void onAnimationRepeat(Animation animation) {            }        });        mask.startAnimation(alphaAnimation);    }}