金鞍玉勒寻芳客,未信我庐别有春。这篇文章主要讲述android千变万化的ViewPager之四相关的知识,希望能为你提供帮助。
今天,我们来看看自定义ViewPager。
首先,我们得知道自定义View得在原来的View的基础上。因此,如果我们想自定义ViewPager,必须继承原来的ViewPager。
那么我们为什么要自定义View呢?因为我们可以在自定义的ViewPager上添加动画效果。
1.获得左页面和右页面
在ViewPager中,我们怎么准确的获得左页面和右页面呢?
在一个自定义的ViewPager当中,我们会重写这个protected void onPageScrolled(int position, float offset, int offsetPixels) 方法。我们通过测试这个方法中的参数可以得到结论:当页面向右滑动时,offset是0~1,而当向左滑动时,offset是1~0;同时我们会发现在position在未滑动时,position的值就等于当前view的位置。当向右滑动时(正在滑动,并没有滑动完)position是不变的,直到滑动结束才加一;同时向左滑动时(正在滑动,并没有滑动完),position已经减一了,结束后保持减一的值。
因此,我们得出一个记录:向右滑动时,左页面的下表为position,右页面是position + 1;向左也是这样的。因此我们利用这个特点,写出我们得程序。
代码
布局文件代码
xml代码
1 < RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 2xmlns:tools="http://schemas.android.com/tools" 3android:layout_width="match_parent" 4android:layout_height="match_parent" 5tools:context="com.example.android_viewpager_anim.MainActivity" > 6 7< com.example.Custom_ViewPager.Custom_ViewPager 8android:id="@+id/viewpager2" 9android:layout_width="match_parent" 10android:layout_height="match_parent" > 11 12< /com.example.Custom_ViewPager.Custom_ViewPager> 13 14 < /RelativeLayout>
Activity代码
java代码
1 package com.example.android_viewpager; 2 3 import java.util.ArrayList; 4 import java.util.List; 5 6 import com.example.Custom_ViewPager.Custom_ViewPager; 7 8 import android.app.Activity; 9 import android.os.Bundle; 10 import android.support.v4.view.PagerAdapter; 11 import android.util.Log; 12 import android.view.View; 13 import android.view.ViewGroup; 14 import android.widget.ImageView; 15 import android.widget.ImageView.ScaleType; 16 17 public class MainActivity extends Activity { 18//使用自定义的Viewpager 19private Custom_ViewPager viewpager = null; 20private int[] res = new int[] { R.drawable.guide_image1, R.drawable.guide_image2, R.drawable.guide_image3 }; 21private List< ImageView> list = new ArrayList< ImageView> (); 22protected void onCreate(Bundle savedInstanceState) { 23Log.i("main", "1"); 24super.onCreate(savedInstanceState); 25Log.i("main", "2"); 26setContentView(R.layout.activity_main2); 27Log.i("main", "3"); 28viewpager = (Custom_ViewPager) findViewById(R.id.viewpager2); 29Log.i("main", "4"); 30//viewpager.setPageTransformer(true, new MyTransformer()); 31viewpager.setAdapter(new PagerAdapter() { 32@Override 33public Object instantiateItem(ViewGroup container, int position) { 34ImageView imageview = new ImageView(MainActivity.this); 35imageview.setImageResource(res[position]); 36imageview.setScaleType(ScaleType.CENTER_CROP); 37container.addView(imageview); 38list.add(imageview); 39viewpager.setViewForpostition(position, imageview); 40return imageview; 41} 42@Override 43public void destroyItem(ViewGroup container, int position, Object object) { 44// TODO Auto-generated method stub 45container.removeView(list.get(position)); 46viewpager.removeViewFromposition(position); 47} 48public boolean isViewFromObject(View arg0, Object arg1) { 49// TODO Auto-generated method stub 50return arg0 == arg1; 51} 52 53@Override 54public int getCount() { 55// TODO Auto-generated method stub 56return res.length; 57} 58}); 59} 60 }
自定义的ViewPager
Java代码
1 package com.example.Custom_ViewPager; 2 3 import java.util.HashMap; 4 import java.util.Map; 5 6 import com.nineoldandroids.view.ViewHelper; 7 8 import android.content.Context; 9 import android.support.v4.view.ViewPager; 10 import android.util.AttributeSet; 11 import android.util.Log; 12 import android.widget.ImageView; 13 14 public class Custom_ViewPager extends ViewPager{ 15private ImageView Left = null; 16private ImageView Right = null; 17private final float Min_Scale = 0.1f; 18private float Scale = 0f; 19private float trans = 0f; 20private float alpha = 1f; 21 22private Map< Integer , ImageView> map=new HashMap< Integer, ImageView> (); 23public Custom_ViewPager(Context context) { 24super(context); 25// TODO Auto-generated constructor stub 26} 27public Custom_ViewPager(Context context, AttributeSet attrs) { 28 29super(context, attrs); 30} 31public void setViewForpostition(Integer position, ImageView view) 32{ 33map.put(position, view); 34} 35publicvoid removeViewFromposition(Integer position) 36{ 37map.remove(position); 38} 39 40protected void onPageScrolled(int position, float offset, int offsetPixels) { 41//Log.e("main", "position = "+position + " offset = " + offset); 42Left = map.get(position); 43Right = map.get(position + 1); 44animStack(Left, Right, offset, offsetPixels); 45super.onPageScrolled(position, offset, offsetPixels); 46} 47//offsetPixels随offset变化,等于屏幕宽度*offset 48private void animStack(ImageView Left, ImageView Right, float offset, int offsetPixels) 49{ 50if(Right != null) 51{ 52Scale = (1 - Min_Scale) * offset + Min_Scale; 53Log.i("main", "" + Scale); 54ViewHelper.setScaleX(Right, Scale); 55ViewHelper.setScaleY(Right, Scale); 56/* 57* getPageMargin() 58* 或者页面之间的距离 59*/ 60trans = offsetPixels - getWidth() - getPageMargin(); 61ViewHelper.setTranslationX(Right, trans); 62ViewHelper.setAlpha(Right, Scale); 63} 64if(Left != null) 65{ 66Left.bringToFront(); 67ViewHelper.setAlpha(Left, 1 - Scale); 68} 69ImageView imageview = map.get(getCurrentItem()); 70float alpha2 = 1f; 71imageview.setAlpha(alpha2); 72} 73 }
【android千变万化的ViewPager之四】
推荐阅读
- 百度-Android-二面小结
- Android Service演义
- Week2 Bing词典Android客户端案例分析
- html5 SVG绘制以及和canvas的区别 – HTML5教程
- html媒体类型和字符编码参考文档 – HTML教程
- PHP imagealphablending()函数用法介绍
- 页面设计(CSS页脚设计示例)
- jQuery last()函数和使用示例
- PHP IntlChar::charMirror()函数用法示例