| 我们还是先来看一下效果图,让大家清楚我们将要说的是一个怎么效果,
  笔者这用的图片很烂,是随便截了一个项目的界面做成的,大家从上面可以看出这是一个界面滑动效果,而且下面有导航条指引的,导航条和上面的界面是可以循环的,我们经常可以在一些软件中看到这种效果,如腾讯微信在安装后就有这一个效果,用此向用户图文介绍软件的功能,其实这一功能很简单,
 简单介绍一下要点:
 上面的界面是一个ViewFlipper控件,通过对ViewFlipper加入数个界面,
 下面的那导航条是一个LinearLayout控件,在它中加入一个imageview数组,通过数组的下标来控件当前选中的图片,
 下面androidkaifa.com就为大家提供这个效果的代码,希望对大家有帮助:public class ExtendsFrameLayoutView extends FrameLayout {
 private int mCurrentIndex=0;
 private Context context;
 //点击屏幕的X左边值.
 private float startX;
 //设备的宽度.
 private int mDisplayWidth;
 /**
 * 从左到右进入的动画.
 */
 private Animation mLeft2RightInAnimation;
 /**
 * 从左到右出去动画.
 */
 private Animation mLeft2RightOutAnimation;
 /**
 * 从右到左进入动画.
 */
 private Animation mRight2LeftInAnimation;
 /**
 * 从右到左出去动画.
 */
 private Animation mRight2LeftOutAnimation;
 private long duration=1000;
 private ViewFlipper mViewFlipper;
 //生成下面的那个点点的容器
 private LinearLayout mTipLinearLayout;
 //正常显示的点点
 private Bitmap mPointNorBitmap;
 //被选中的点点
 private Bitmap mPointSelectBitmap;
 
 private int[] imgResIds = {R.drawable.test1,R.drawable.test2,R.drawable.test3,
 R.drawable.test4,R.drawable.test5};
 
 public ExtendsFrameLayoutView(Context context, AttributeSet attrs,
 int defStyle) {
 super(context, attrs, defStyle);
 initView();
 }
     public ExtendsFrameLayoutView(Context context, AttributeSet attrs) {super(context, attrs);
 initView();
 }
     public ExtendsFrameLayoutView(Context context) {super(context);
 initView();
 }
 //初始化控件
 public void initView(){
 context=getContext();
 mDisplayWidth=getResources().getDisplayMetrics().widthPixels;
 mViewFlipper=new ViewFlipper(context);
 mTipLinearLayout=new LinearLayout(context);
 mPointNorBitmap=BitmapFactory.decodeResource(context.getResources(), R.drawable.btn_normal);
 mPointSelectBitmap=BitmapFactory.decodeResource(getResources(), R.drawable.btn_focus);
 ////将图片界面加入mViewFlipper布局中
 for(int i=0;i<imgResIds.length;i++){
 ImageView imageView=new ImageView(context);
 imageView.setImageResource(imgResIds);
 mViewFlipper.addView(imageView);
 }
 //将下面的那些点点动态加入到LinearLayout布局中
 for(int j=0;j<imgResIds.length;j++){
 ImageView imageView=new ImageView(context);
 if(j==0){
 imageView.setImageBitmap(mPointSelectBitmap);
 }else{
 imageView.setImageBitmap(mPointNorBitmap);
 }
 mTipLinearLayout.addView(imageView);
 }
 addView(mViewFlipper);
 addView(mTipLinearLayout);
 //设置下面的那些点点按底部和水平居中
 mTipLinearLayout.setGravity(Gravity.BOTTOM|Gravity.CENTER_HORIZONTAL);
 //初始化动画
 mLeft2RightInAnimation = new TranslateAnimation(-mDisplayWidth, 0, 0, 0);
 mLeft2RightInAnimation.setDuration(duration);
 mLeft2RightOutAnimation = new TranslateAnimation(0, mDisplayWidth, 0, 0);
 mLeft2RightOutAnimation.setDuration(duration);
 
 mRight2LeftInAnimation = new TranslateAnimation(mDisplayWidth, 0, 0, 0);
 mRight2LeftInAnimation.setDuration(duration);
 mRight2LeftOutAnimation = new TranslateAnimation(0, -mDisplayWidth, 0, 0);
 mRight2LeftOutAnimation.setDuration(duration);
 }
     @Overridepublic boolean onTouchEvent(MotionEvent event) {
 switch(event.getAction()){
 case MotionEvent.ACTION_DOWN:
 startX=event.getX();
 break;
 case MotionEvent.ACTION_UP:
 ImageView lastImageView=(ImageView)mTipLinearLayout.getChildAt(mCurrentIndex);
 //通过对触摸屏幕时的X坐标的改变来判断导航的方向
 if(event.getX()>startX){//后退
 mViewFlipper.setInAnimation(mLeft2RightInAnimation);
 mViewFlipper.setOutAnimation(mLeft2RightOutAnimation);
 mViewFlipper.showPrevious();
 mCurrentIndex--;
 if(mCurrentIndex<0){
 mCurrentIndex=imgResIds.length-1;
 }
 }else if(event.getX()<startX){//前进
 mViewFlipper.setInAnimation(mRight2LeftInAnimation);
 mViewFlipper.setOutAnimation(mRight2LeftOutAnimation);
 mViewFlipper.showNext();
 mCurrentIndex++;
 if(mCurrentIndex>imgResIds.length-1){
 mCurrentIndex=0;
 }
 }
 ImageView imageView=(ImageView)mTipLinearLayout.getChildAt(mCurrentIndex);
 imageView.setImageBitmap(mPointSelectBitmap);
 lastImageView.setImageBitmap(mPointNorBitmap);
 break;
 default :
 break;
 }
 return true;
 }
 }
 主activity类代码:
 protected void onCreate(Bundle savedInstanceState) {
 // TODO Auto-generated method stub
 super.onCreate(savedInstanceState);
 setContentView(new ExtendsFrameLayoutView(this));
 }
 看完上面的代码,不知大家会不会有同感,这功能其实很简单,
 可能有一些朋友需要让这个效果是自动滚动的,如这样,可自己另加一个线程,每隔多少时间让它执行一次IF下面的语句(需将IF里的代码单独放在一个方法中),整个项目代码,笔者就没有放上来了,需要的朋友,请留言,我发给你!
 
 |