zoukankan      html  css  js  c++  java
  • android listview的HeadView左右切换图片(仿新浪,网易,百度等切换图片)

    首先我们还是看一些示例:(网易,新浪,百度)

     

      

      


    显示效果都不错,可是手感就不一样了,百度最棒,网易还行,新浪就操作很不好,这里我说的是滑动切换图片.自己可以测试一下.不得不说牛叉的公司确实有哦牛叉的道理.

    下面我简单的介绍下实现方法:其实就是listview addHeaderView.只不过这个view是一个可以切换图片的view,至于这个view怎么做,就要根据自己的喜爱了,实现有多种方法,下面我简单介绍一下.

    第一种:ViewFlipper+GestureDetector

    主布局就是一个listview,这里就不介绍了,我介绍下切换图片布局head_iamge.xml


    <span style="font-size:12px;"><?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical" >

        <FrameLayout
            android:id="@+id/fl_main"
            android:layout_width="match_parent"
            android:layout_height="wrap_content" >

            <ViewFlipper
                android:id="@+id/ViewFlipper01"
                android:layout_width="fill_parent"
                android:layout_height="fill_parent" >
            </ViewFlipper>

            <LinearLayout
                android:id="@+id/ll_point"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_gravity="bottom|center_horizontal"
                android:layout_marginBottom="10dp"
                android:src="@drawable/indicator" />
        </FrameLayout>

    </LinearLayout></span>
    这里我就添加一系列切换点,至于显示新闻标题,透明效果等等,大家可以自己布局,方法同理,不难实现.

    接下来我们看动画布局.

    push_left_in.xml

    <span style="font-size:12px;"><?xml version="1.0" encoding="utf-8"?>
    <set xmlns:android="http://schemas.android.com/apk/res/android"
        android:fillAfter="true" >

        <translate
            android:duration="500"
            android:fromXDelta="-100%p"
            android:toXDelta="0" />

        <alpha
            android:duration="500"
            android:fromAlpha="0.1"
            android:toAlpha="1.0" />

    </set></span>[/mw_shl_code]
    push_left_out.xml
    [mw_shl_code=java,true]<span style="font-size:12px;"><?xml version="1.0" encoding="utf-8"?>
    <set xmlns:android="http://schemas.android.com/apk/res/android" >

        <translate
            android:duration="500"
            android:fromXDelta="0"
            android:toXDelta="-100%p" />

        <alpha
            android:duration="500"
            android:fromAlpha="1.0"
            android:toAlpha="0.5" />

    </set></span>[/mw_shl_code]
    push_right_in.xml
    <span style="font-size:12px;"><?xml version="1.0" encoding="utf-8"?>
    <set xmlns:android="http://schemas.android.com/apk/res/android"
        android:fillAfter="true" >

        <translate
            android:duration="500"
            android:fromXDelta="100%p"
            android:toXDelta="0" />

        <alpha
            android:duration="500"
            android:fromAlpha="0.1"
            android:toAlpha="1.0" />

    </set></span>
    push_right_out.xml
    <span style="font-size:12px;"><?xml version="1.0" encoding="utf-8"?>
    <set xmlns:android="http://schemas.android.com/apk/res/android" >

        <translate
            android:duration="500"
            android:fromXDelta="0"
            android:toXDelta="100%p" />

        <alpha
            android:duration="500"
            android:fromAlpha="1.0"
            android:toAlpha="0.5" />

    </set>
    我简单介绍下这些布局:

    push_left_in:左边进入,则要进入的view初始位置在-100%p位置,终止位置在0,而push_left_out:左边出来,则此时view的位置在0,而终止位置在-100%p.

    右进右出同理,至于alpha渐变,很简单,动画就说道这里,相信了解动画的同学们不用看就ok了.

    下面重点是如何实现.

    代码:


    package com.jj.chage2;

    import java.util.ArrayList;
    import java.util.Timer;
    import java.util.TimerTask;

    import android.app.Activity;
    import android.content.Context;
    import android.graphics.Bitmap;
    import android.graphics.BitmapFactory;
    import android.graphics.Matrix;
    import android.os.Bundle;
    import android.util.Log;
    import android.view.GestureDetector;
    import android.view.LayoutInflater;
    import android.view.MotionEvent;
    import android.view.View;
    import android.view.ViewGroup;
    import android.view.View.OnTouchListener;
    import android.view.animation.AnimationUtils;
    import android.widget.AdapterView;
    import android.widget.AdapterView.OnItemClickListener;
    import android.widget.Button;
    import android.widget.ImageView.ScaleType;
    import android.widget.LinearLayout.LayoutParams;
    import android.widget.ArrayAdapter;
    import android.widget.FrameLayout;
    import android.widget.ImageView;
    import android.widget.LinearLayout;
    import android.widget.ListView;
    import android.widget.TextView;
    import android.widget.Toast;
    import android.widget.ViewFlipper;

    public class MainActivity extends Activity implements
                    GestureDetector.OnGestureListener {
            private GestureDetector detector;
            private ViewFlipper flipper;
            private int image_id[] = { R.drawable.a, R.drawable.b, R.drawable.c };
            private ListView lv_main;
            private LayoutInflater layoutInflater;
            private LinearLayout ll_point;
            private FrameLayout frameLayout;
            private final String msg[] = { "one", "two", "three", "four", "five",
                            "six", "seven" };
            private int frameheight;// 图片的高度
            private int window_width;// 屏幕宽度
            private ArrayList<ImageView> imageViews;// ponit 集合
            private ArrayList<View> views;// flipper的孩子
            private Timer timer;

            /***
             * 初始化 point
             */
            void initPoint() {
                    imageViews = new ArrayList<ImageView>();
                    ImageView imageView;
                    for (int i = 0; i < image_id.length; i++) {
                            imageView = new ImageView(this);
                            imageView.setBackgroundResource(R.drawable.indicator);
                            LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(
                                            new ViewGroup.LayoutParams(LayoutParams.WRAP_CONTENT,
                                                            LayoutParams.WRAP_CONTENT));
                            layoutParams.leftMargin = 10;
                            layoutParams.rightMargin = 10;
                            ll_point.addView(imageView, layoutParams);
                            imageViews.add(imageView);
                    }

            }

            /***
             * ChildView
             */
            void initChildView(ViewFlipper flipper) {
                    views = new ArrayList<View>();
                    LayoutParams layoutParams = new LayoutParams(LayoutParams.FILL_PARENT,
                                    LayoutParams.FILL_PARENT);
                    for (int i = 0; i < image_id.length; i++) {
                            ImageView imageView = new ImageView(this);
                            imageView.setScaleType(ScaleType.FIT_XY);
                            Bitmap bitmap = BitmapFactory.decodeResource(getResources(),
                                            image_id);
                            Bitmap bitmap2 = getBitmap(bitmap, window_width);
                            frameheight = bitmap2.getHeight();// 获取要显示的高度
                            imageView.setImageResource(image_id);
                            flipper.addView(imageView, layoutParams);
                            views.add(imageView);
                    }
                    initPoint();
            }

            /***
             * 初始化 HeadImage
             */
            void initHeadImage() {
                    layoutInflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
                    View headview = layoutInflater.inflate(R.layout.head_image, null);

                    flipper = (ViewFlipper) headview.findViewById(R.id.ViewFlipper01);

                    ll_point = (LinearLayout) headview.findViewById(R.id.ll_point);
                    frameLayout = (FrameLayout) headview.findViewById(R.id.fl_main);
                    initChildView(flipper);

                    LayoutParams layoutParams = (LayoutParams) frameLayout
                                    .getLayoutParams();
                    layoutParams.height = frameheight;
                    frameLayout.setLayoutParams(layoutParams);
                    draw_Point(0);// 默认首次进入
                    lv_main.addHeaderView(headview);// 要卸载setAdapter前面
                    lv_main.setAdapter(new ArrayAdapter<String>(this,
                                    android.R.layout.simple_list_item_1, msg));

            }

            /***
             * init view
             */
            void initView() {
                    setTitle("jjhappyforever...");
                    setContentView(R.layout.main);
                    lv_main = (ListView) findViewById(R.id.lv_main);
                    lv_main.setOnItemClickListener(new OnItemClickListener() {

                            @Override
                            public void onItemClick(AdapterView<?> parent, View view,
                                            int position, long id) {

                                    if (position != 0)
                                            Toast.makeText(MainActivity.this, msg[position - 1], 1)
                                                            .show();
                                    else {
                                            int index = getPageIndex(flipper.getCurrentView());
                                            Toast.makeText(MainActivity.this, "图" + index, 1).show();

                                    }

                            }
                    });
                    initHeadImage();
            }

            /***
             * 更新选中点
             *
             * @param index
             */
            private void draw_Point(int index) {
                    for (int i = 0; i < imageViews.size(); i++) {
                            imageViews.get(i).setImageResource(R.drawable.indicator);
                    }
                    imageViews.get(index).setImageResource(R.drawable.indicator_focused);
            }

            @Override
            public void onCreate(Bundle savedInstanceState) {
                    super.onCreate(savedInstanceState);
                    setContentView(R.layout.main);
                    // 获取屏幕的宽度
                    window_width = (int) getResources().getDimension(R.dimen.window_width);
                    detector = new GestureDetector(this);
                    initView();

                    timer = new Timer(true);
                    timer.schedule(new TimerTask() {
                            @Override
                            public void run() {
                                    runOnUiThread(new Runnable() {
                                            @Override
                                            public void run() {

                                                    int pageIndex = getPageIndex(flipper.getCurrentView());

                                                    if (pageIndex == flipper.getChildCount() - 1)
                                                            pageIndex = 0;
                                                    else
                                                            pageIndex++;

                                                    flipper.setInAnimation(AnimationUtils.loadAnimation(
                                                                    MainActivity.this, R.anim.push_right_in));
                                                    flipper.setOutAnimation(AnimationUtils.loadAnimation(
                                                                    MainActivity.this, R.anim.push_left_out));
                                                    flipper.showNext();
                                                    draw_Point(pageIndex);

                                            }
                                    });
                            }
                    }, 5000, 5000);

            }

            /***
             * 对图片处理
             *
             * @author zhangjia
             *
             */
            Bitmap getBitmap(Bitmap bitmap, int width) {
                    int w = bitmap.getWidth();
                    int h = bitmap.getHeight();
                    Matrix matrix = new Matrix();
                    float scale = (float) width / w;
                    // 保证图片不变形.
                    matrix.postScale(scale, scale);
                    // w,h是原图的属性.
                    return Bitmap.createBitmap(bitmap, 0, 0, w, h, matrix, true);
            }

            @Override
            public boolean dispatchTouchEvent(MotionEvent ev) {
                    this.detector.onTouchEvent(ev);
                    return super.dispatchTouchEvent(ev);
            }

            @Override
            public boolean onDown(MotionEvent e) {
                    return true;
            }

            /***
             * 返回当前第几屏
             */
            int getPageIndex(View view) {
                    for (int i = 0; i < views.size(); i++) {
                            if (view == views.get(i))
                                    return i;
                    }
                    return 0;

            }

            /**
             * 监听滑动
             */
            @Override
            public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
                            float velocityY) {
                    int pageIndex = getPageIndex(flipper.getCurrentView());

                    // 左划
                    if (e1.getX() - e2.getX() > 120) {
                            this.flipper.setInAnimation(AnimationUtils.loadAnimation(this,
                                            R.anim.push_right_in));
                            this.flipper.setOutAnimation(AnimationUtils.loadAnimation(this,
                                            R.anim.push_left_out));
                            this.flipper.showNext();
                            if (pageIndex == flipper.getChildCount() - 1)
                                    draw_Point(0);
                            else
                                    draw_Point(++pageIndex);
                            return true;
                            // 右划
                    } else if (e1.getX() - e2.getX() < -120) {
                            this.flipper.setInAnimation(AnimationUtils.loadAnimation(this,
                                            R.anim.push_left_in));
                            this.flipper.setOutAnimation(AnimationUtils.loadAnimation(this,
                                            R.anim.push_right_out));
                            this.flipper.showPrevious();
                            if (pageIndex == 0)
                                    draw_Point(flipper.getChildCount() - 1);
                            else
                                    draw_Point(--pageIndex);
                            return true;
                    }
                    return true;
            }

            @Override
            public void onLongPress(MotionEvent e) {

            }

            @Override
            public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX,
                            float distanceY) {
                    return false;
            }

            @Override
            public void onShowPress(MotionEvent e) {

            }

            @Override
            public boolean onSingleTapUp(MotionEvent e) {
                    return false;
            }

    }
    上诉代码写的有点小乱,别介意.

    效果:

     

      

      


    你 可以手势左右滑动图片切换,由于我们加入了动画,则在切换图片效果会比较人性,这一点比较不错.另外一点,我开启了timer,让它自己切换,感觉这点比 较不错,可惜好多应用都没有这么搞,总之实现就行了,我们开发人员嘛,就是开发别人想出来的东西,感慨程序员苦逼...

    如 果你按照上诉操作的话会有几个问题:1,我移动图片下面的item图片也会切换,2,我在滑动切换图片的时候偶尔也会执行onclick事件,这两点 bug严重不允许,为之我也煞费神经细胞啊,没办法因为基础不好,对触摸种种事件还是搞不明白,有时间了还得在看看研究研究,扯远了,下面我说下解决方 法:

    第一:我只让listview的第一项监听手势操作,其他的不执行.

    方法很简单,自定义一个listview.重写其onTouchEvent事件.


    @Override
            public boolean onTouchEvent(MotionEvent ev) {
                    Log.e("jj", "onTouchEvent...");
                    int x = (int) ev.getX();
                    int y = (int) ev.getY();
                    int position = pointToPosition(x, y);
                    // 只有headview才进行手势操作.
                    if (position == 0) {
                            // 注入手势
                            gestureDetector.onTouchEvent(ev);
                    }
                    return super.onTouchEvent(ev);
            }
    大家一看就明白了,我们只对position==0进行手势监听,也许有 人问了,其实也可以直接在MainActivity中的dispatchTouchEvent分发事件中获取点击listview的position,可 是这样不准确,我点击第0项获取的有的是0,有的是1,原因目前不明,不过但可以肯定,这样是能获取listview的position的,所以就干脆自 定义吧,这样不会出错.这样解决了不会滑动下面item图片跟着切换.

    再 有就是我们要把listview item的第一项 onclick事件禁止了,我们直接把这个点击事件搬到onSingleTapUp中,这样就不会因为手势操作而影响item的onclick事件了,这 样问题基本都解决了,其实我想有简单的方法,只要把Touch事件弄懂,可惜啊...不给力啊...

    效果和上面一样.

    经过多次测试,目前没有发现问题,如有不妥我会给出提示.

    第二种方法:ViewPager.

    viewpager效果相比大家都熟知,因此我就省略显示的那部分,方法和上面一样,只是显示用的是viewpager而已.

    但是这里面存在一个严重的问题:ViewPager和listview共存的问题,二者都有自身的滑动事件,必然要产生冲突。viewpager操作起来相当的不灵敏.

    这里我重点说一下解决办法:我们需要自定义Listview,对其拦截事件进行处理.另外我们要用手势,判断上下左右滑动.


    package com.jj.chage;

    import android.content.Context;
    import android.util.AttributeSet;
    import android.util.Log;
    import android.view.GestureDetector;
    import android.view.GestureDetector.SimpleOnGestureListener;
    import android.view.MotionEvent;
    import android.view.View;
    import android.widget.ListView;

    public class MyListView extends ListView {
            private GestureDetector mGestureDetector;
            View.OnTouchListener mGestureListener;

            public MyListView(Context context) {
                    super(context);
            }

            public MyListView(Context context, AttributeSet attrs) {
                    super(context, attrs);
                    mGestureDetector = new GestureDetector(new YScrollDetector());
                    setFadingEdgeLength(0);
            }

            public MyListView(Context context, AttributeSet attrs, int defStyle) {
                    super(context, attrs, defStyle);
            }

            @Override
            public boolean onInterceptTouchEvent(MotionEvent ev) {
                    super.onInterceptTouchEvent(ev);
                    return mGestureDetector.onTouchEvent(ev);
            }

            class YScrollDetector extends SimpleOnGestureListener {
                    @Override
                    public boolean onScroll(MotionEvent e1, MotionEvent e2,
                                    float distanceX, float distanceY) {
                            if (Math.abs(distanceY) >= Math.abs(distanceX)) {
                                    Log.e("jj", "上下....");
                                    return true;
                            }
                            Log.e("jj", "左右....");
                            return false;
                    }
            }
    }

    这样viewpager滑动就不会受listview干扰了,listview上下也可以滑动.

    由于自己对事件分发不是很了解,所以不过多介绍,想知道的话,自己慢慢研究吧,我这里只是提供一个解决方法,我也在学习中...

    其他部分不难,这里就不讲解了.


       

       


              滑动ing                                         滑动ing                                                 点击

    感觉还是第二种方法好,这也是为什么那么多客户端都是这么搞,不过各有千秋,因人而异.

    对第二种方法实现简单讲解:

    我们的目的是:我们左右滑动ViewPager的时候ListView不影响,而当ViewPager上下滑动的时候可以随意滑动.

    我 们可以这样做:我们把onInterceptTouchEvent返回值更改为fase,那么意味着,如果孩子存在 onInterceptTouchEvent那么会继续传递给孩子的onInterceptTouchEvent...后面我们不管(此时 ListView失去touch事件),这个时候ViewPager获取Touch事件. 这个时候ViewPager就可以左右滑动(不可以上下滑动)。 如果孩子不存在onInterceptTouchEvent,ListView执行本身ontouch.  

    那么把onInterceptTouchEvent返回值更改为true.意思就是:我对touch事件进行拦截,不进行向下传递,直接执行自身的Ontouch事件,这个时候ViewPager就可以上下滑了(不可以左右滑动切换).

    根据实情,那么我们如何动态控制这个onInterceptTouchEvent的返回值,这个时候我们可以借助:GestureDetector手势来实现.


             /*
             *
             * @author zhangjia
             *
             */
            class YScrollDetector extends SimpleOnGestureListener {
                    @Override
                    public boolean onScroll(MotionEvent e1, MotionEvent e2,
                                    float distanceX, float distanceY) {
                            if (Math.abs(distanceY) >= Math.abs(distanceX)) {
                                    Log.e("jj", "上下....");
                                    return true;
                            }
                            Log.e("jj", "左右....");
                            return false;
                    }
    上面这个方法可以根据手势来判断我们手的滑动方向.而:boolean b = mGestureDetector.onTouchEvent(ev);

    这 个值就是onScroll返回的值.这个值是代表我们手势mGestureDetector消费了没,为什么这么说呢,因为这个和我们外界的touch分 开了,就算我们在这里消费了那么外面该怎么执行就怎么执行。经过测试觉得mGestureDetector.onTouchEvent(ev)这个方法就 是执行手势相应方法,然后返回的是onScroll的返回值.

    而当我们上下滑动的时候mGestureDetector.onTouchEvent(ev)返回true,而ViewPager需要上下滑动的时候只需要将onInterceptTouchEvent的返回值更改为true,左右滑动同理.

    那么这样我们就实现了ViewPager与ListView滑动的冲突.

    就说道这里,如有错误和疑问请留言.



    Android仿QQ微信开场导航以及登陆界面

    相信大家对于微信等社交应用的UI界面已经都很熟悉了,该UI最值得借鉴的莫过于第一次使用的时候一些列产品介绍的图片,可以左右滑动浏 览,最后 进入应用,这一效果适用于多种项目中,相信今后开发应用一定会用得到。网路上也有不少这样的例子可以参考,不过看别人的代码是一回事,自己实际做起来又是 另一回事,今天的这个微信的Demo是研究过多个类似的界面后自己动手去实现的效果,并且都加上了详细的注释(虽然有的多余),方便以后回顾一看就能看明 白,只有真正亲自写一写,体会才会更深刻,例子中的图片都是在微信的APK中提取出来的,涉及到的知识点无外乎是ViewPager和 Animation。
    首先是开场闪屏的一个界面,使用handler控制该页面指定时间后进行跳转
                                     



    [mw_shl_code=java,true]package com.example.weichat.UI;

    import com.example.weichat.R;

    import android.app.Activity;
    import android.content.Intent;
    import android.os.Bundle;
    import android.os.Handler;

    /** 开场欢迎动画 */
    public class WelcomeA extends Activity {
            @Override
            public void onCreate(Bundle savedInstanceState) {
                    super.onCreate(savedInstanceState);
                    setContentView(R.layout.strat);
                    //延迟两秒后执行run方法中的页面跳转
                    new Handler().postDelayed(new Runnable() {

                            @Override
                            public void run() {
                                    Intent intent = new Intent(WelcomeA.this, WhatsnewPagesA.class);
                                    startActivity(intent);
                                    WelcomeA.this.finish();
                            }
                    }, 2000);
            [/mw_shl_code]
    接着是主要的部分,也就是一系列的功能介绍图片,主要是viewpager来实现,嵌套在上面的小圆点的跟随导航也是要实现的效果之一
                                  

       

                            



    [mw_shl_code=java,true]package com.example.weichat.UI;

    import java.util.ArrayList;
    import android.app.Activity;
    import android.content.Intent;
    import android.os.Bundle;
    import android.support.v4.view.PagerAdapter;
    import android.support.v4.view.ViewPager;
    import android.support.v4.view.ViewPager.OnPageChangeListener;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;
    import android.view.ViewGroup.LayoutParams;
    import android.view.Window;
    import android.widget.ImageView;
    import com.example.weichat.R;

    /** What's new 的导航界面 */
    public class WhatsnewPagesA extends Activity {
            /** Viewpager对象 */
            private ViewPager viewPager;
            private ImageView imageView;
            /** 创建一个数组,用来存放每个页面要显示的View */
            private ArrayList<View> pageViews;
            /** 创建一个imageview类型的数组,用来表示导航小圆点 */
            private ImageView[] imageViews;
            /** 装显示图片的viewgroup */
            private ViewGroup viewPictures;
            /** 导航小圆点的viewgroup */
            private ViewGroup viewPoints;

            @Override
            protected void onCreate(Bundle savedInstanceState) {
                    // TODO Auto-generated method stub
                    super.onCreate(savedInstanceState);
                    requestWindowFeature(Window.FEATURE_NO_TITLE);
                    LayoutInflater inflater = getLayoutInflater();
                    pageViews = new ArrayList<View>();
                    pageViews.add(inflater.inflate(R.layout.viewpager01, null));
                    pageViews.add(inflater.inflate(R.layout.viewpager02, null));
                    pageViews.add(inflater.inflate(R.layout.viewpager03, null));
                    pageViews.add(inflater.inflate(R.layout.viewpager04, null));
                    pageViews.add(inflater.inflate(R.layout.viewpager05, null));
                    pageViews.add(inflater.inflate(R.layout.viewpager06, null));

                    // 小圆点数组,大小是图片的个数
                    imageViews = new ImageView[pageViews.size()];
                    // 从指定的XML文件中加载视图
                    viewPictures = (ViewGroup) inflater.inflate(R.layout.viewpagers, null);

                    viewPager = (ViewPager) viewPictures.findViewById(R.id.guidePagers);
                    viewPoints = (ViewGroup) viewPictures.findViewById(R.id.viewPoints);

                    // 添加小圆点导航的图片
                    for (int i = 0; i < pageViews.size(); i++) {
                            imageView = new ImageView(WhatsnewPagesA.this);
                            imageView.setLayoutParams(new LayoutParams(20, 20));
                            imageView.setPadding(5, 0, 5, 0);
                            // 吧小圆点放进数组中
                            imageViews = imageView;
                            // 默认选中的是第一张图片,此时第一个小圆点是选中状态,其他不是
                            if (i == 0)
                                    imageViews.setImageDrawable(getResources().getDrawable(
                                                    R.drawable.page_indicator_focused));
                            else
                                    imageViews.setImageDrawable(getResources().getDrawable(
                                                    R.drawable.page_indicator_unfocused));
                            // 将imageviews添加到小圆点视图组
                            viewPoints.addView(imageViews);
                    }

                    setContentView(viewPictures);

                    viewPager.setAdapter(new NavigationPageAdapter());
                    // 为viewpager添加监听,当view发生变化时的响应
                    viewPager.setOnPageChangeListener(new NavigationPageChangeListener());
            }

            // 导航图片view的适配器,必须要实现的是下面四个方法
            class NavigationPageAdapter extends PagerAdapter {

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

                    @Override
                    public boolean isViewFromObject(View arg0, Object arg1) {
                            return arg0 == arg1;
                    }

                    // 初始化每个Item
                    @Override
                    public Object instantiateItem(View container, int position) {
                            ((ViewPager) container).addView(pageViews.get(position));
                            return pageViews.get(position);
                    }

                    // 销毁每个Item
                    @Override
                    public void destroyItem(View container, int position, Object object) {
                            ((ViewPager) container).removeView(pageViews.get(position));
                    }

            }

            // viewpager的监听器,主要是onPageSelected要实现
            class NavigationPageChangeListener implements OnPageChangeListener {

                    @Override
                    public void onPageScrollStateChanged(int arg0) {

                    }

                    @Override
                    public void onPageScrolled(int arg0, float arg1, int arg2) {

                    }

                    @Override
                    public void onPageSelected(int position) {
                            // 循环主要是控制导航中每个小圆点的状态
                            for (int i = 0; i < imageViews.length; i++) {
                                    // 当前view下设置小圆点为选中状态
                                    imageViews.setImageDrawable(getResources().getDrawable(
                                                    R.drawable.page_indicator_focused));
                                    // 其余设置为飞选中状态
                                    if (position != i)
                                            imageViews.setImageDrawable(getResources().getDrawable(
                                                            R.drawable.page_indicator_unfocused));
                            }
                    }

            }

            // 开始按钮方法,开始按钮在XML文件中onClick属性设置;
            // 我试图把按钮在本activity中实例化并设置点击监听,但总是报错,使用这个方法后没有报错,原因没找到
            public void startbutton(View v) {
                    Intent intent = new Intent(WhatsnewPagesA.this, WhatsnewAnimationA.class);
                    startActivity(intent);
                    WhatsnewPagesA.this.finish();
            }

    }
    [/mw_shl_code]
    而后的便是开门的动画效果了,这一块还是比较简单的,分别控制两幅图片的移动动画就可以实现
                            



    [mw_shl_code=java,true]package com.example.weichat.UI;

    import com.example.weichat.R;
    import android.app.Activity;
    import android.content.Intent;
    import android.os.Bundle;
    import android.os.Handler;
    import android.view.animation.Animation;
    import android.view.animation.AnimationSet;
    import android.view.animation.TranslateAnimation;
    import android.widget.ImageView;

    /**导航过后的动画效果界面*/
    public class WhatsnewAnimationA extends Activity {

            private ImageView img_left, img_right;

            @Override
            protected void onCreate(Bundle savedInstanceState) {
                    // TODO Auto-generated method stub
                    super.onCreate(savedInstanceState);
                    setContentView(R.layout.whatnew_animation);
                    img_left = (ImageView) findViewById(R.id.doorpage_left);
                    img_right = (ImageView) findViewById(R.id.doorpage_right);

                    //创建一个AnimationSet对象
                    AnimationSet animLeft = new AnimationSet(true);
                    TranslateAnimation transLeft = new TranslateAnimation(
                                    Animation.RELATIVE_TO_SELF, 0f, Animation.RELATIVE_TO_SELF,
                                    -1f, Animation.RELATIVE_TO_SELF, 0f,
                                    Animation.RELATIVE_TO_SELF, 0f);
                    //设置动画效果持续的时间
                    transLeft.setDuration(2000);
                    //将anim对象添加到AnimationSet对象中
                    animLeft.addAnimation(transLeft);
                    animLeft.setFillAfter(true);
                    img_left.startAnimation(transLeft);
                    transLeft.startNow();
                   
                   
                   
                    //创建一个AnimationSet对象
                    AnimationSet animRight = new AnimationSet(true);
                    TranslateAnimation transRight = new TranslateAnimation(
                                    Animation.RELATIVE_TO_SELF, 0f, Animation.RELATIVE_TO_SELF,
                                    1f, Animation.RELATIVE_TO_SELF, 0f,
                                    Animation.RELATIVE_TO_SELF, 0f);
                    //设置动画效果持续的时间
                    transRight.setDuration(2000);
                    //将anim对象添加到AnimationSet对象中
                    animRight.addAnimation(transRight);
                    animRight.setFillAfter(true);
                    img_right.startAnimation(transRight);
                    transRight.startNow();
                   
                    new Handler().postDelayed(new Runnable() {
                           
                            @Override
                            public void run() {
                                    // TODO Auto-generated method stub
                                    Intent intent = new Intent(WhatsnewAnimationA.this, FirstPageA.class);
                                    startActivity(intent);
                                    WhatsnewAnimationA.this.finish();
                            }
                    }, 1000);
            }
           

    }

    最后进入到我们的登陆界面,就是一个简单的微信登陆布局,代码就不贴了
                                           


      

    Android将ScrollView移动到最底部

    转载地址:http://hi.baidu.com/gaogaf/item/36e8a4c8ac6ba31050505848

    scrollTo方法可以调整view的显示位置。
    在需要的地方调用以下方法即可。
    scroll表示外层的view,inner表示内层的view,其余内容都在inner里。
    注意,方法中开一个新线程是必要的。
    否则在数据更新导致换行时getMeasuredHeight方法并不是最新的高度。

    public static void scrollToBottom(final View scroll, final View inner) {
    Handler mHandler = new Handler();

    mHandler.post(new Runnable() {
    public void run() {
    if (scroll == null || inner == null) {
    return;
    }

    int offset = inner.getMeasuredHeight() - scroll.getHeight();
    if (offset < 0) {
    offset = 0;
    }

    scroll.scrollTo(0, offset);
    }
    });
    }
  • 相关阅读:
    ArrayList源码分析_JDK1.8.0_191
    LinkedList源码分析_JDK1.8.0_191
    HashMap源码分析_JDK1.8.0_191
    生产者消费者模型Java实现
    INT整型最小值取负还是本身的问题
    字节跳动面试题
    go sqlx操作数据库问题
    go gin框架调用cmd运行python脚本问题
    Android视频播放不能使用自研播放器
    mac python版本错误问题以及pip版本错误(anacanda)
  • 原文地址:https://www.cnblogs.com/weixiao870428/p/3745334.html
Copyright © 2011-2022 走看看