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);
}
});
}

时间: 2024-10-13 01:03:45

android listview的HeadView左右切换图片(仿新浪,网易,百度等切换图片)的相关文章

【转】Android android listview的HeadView左右切换图片(仿新浪,网易,百度等切换图片)

首先我们还是看一些示例:(网易,新浪,百度)      下面我简单的介绍下实现方法:其实就是listview addHeaderView.只不过这个view是一个可以切换图片的view,至于这个view怎么做,就要根据自己的喜爱了,实现有多种方法,下面我简单介绍一下. 第一种:ViewFlipper+GestureDetector 主布局就是一个listview,这里就不介绍了,我介绍下切换图片布局head_iamge.xml 1 <span style="font-size:12px;&

仿新浪首页、主题、详情页,纯html静态页面

仿新浪首页.主题.详情页,纯html静态页面,下载地址: http://download.csdn.net/detail/sweetsuzyhyf/8085535

android listview添加headview

listview添加headview后的点击事件 1.头部view:设置view的点击时间,用于屏蔽listview的item的点击事件 <span style="white-space:pre"> </span>View headerView = getLayoutInflater().inflate(R.layout.listhead, null); Button btn = (Button) headerView.findViewById(R.id.but

Android:Umeng(友盟) 微信,QQ,新浪分享 (三)

第一步: 下载并安装SDK 添加代码和资源引用,我们提供了添加资源文件和jar文件的两种方式,可以根据需求选择 解压SDK压缩包,将文件夹中的'main/libs'和'main/res'文件夹复制到你的项目工程根目录下(如使用'ADT 17'以下用户需要手动添加'libs'下的jar文件到工程Path中) 结合上两篇文章 PushSDKMoudle中添加QQ,微信,新浪分享后的libs结构: 注:除jar包外,其余文件夹均需添加对应分享的so包.没有则不添加,附图: 第二步: AndroidMa

高仿新浪点击图片放大(可以拖动,动态缩小放大,以及再次点击图片消失和保存图片的功能)

有图有真相: 最近在做项目的时候用到了点击图片放大效果,于是就开始实现,本以为挺简单的,实现起来还是遇到不少的小问题啊: 第一:只实现点击图片放大,再次点击消失,这个好实现: 第二:只实现图片可以拖动,而且可以动态缩小放大,这个也好实现: 第三:第一 和第二同步实现就出现问题了: 具体的问题是: (1)setOnClickListener 和 setOnTouchListener 同时设置的时候,若是setOnTouchListener的返回值为true,则不会再执行setOnClickList

Android仿新浪新闻SlidingMenu界面的实现 .

先看看原图: 如图所示,这种侧滑效果以另一种方式替代了原先tab导航的那种用户体验方式 给人耳目一新的感觉,现已被广大知名应用所效仿,如新浪新闻,网易新闻,人人网等 那么这种效果该如何实现呢?那就需要用到一个开源库SlidingMenu Github地址:https://github.com/jfeinstein10/SlidingMenu 里面包含了demo示例,相关效果图如下: 同时该库又依赖另一个开源库ActionBarSherkLock ,有关该库的介绍,请看此博文http://blog

仿新浪下拉菜单

要求 仿新浪网,鼠标移入显示下拉菜单,鼠标移出隐藏下拉菜单,具体表现如下图: 代码 <ul> <li id="top">微博</li> <li class="hide">私信</li> <li class="hide">评论</li> <li class="hide">@我</li> </ul> <sc

仿新浪部分静态页面展示

1 <!DOCTYPE html> 2 <html xmlns="http://www.w3.org/1999/xhtml"> 3 <head> 4 <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> 5 <title></title> 6 <link href="css/d

Android 高级UI设计笔记06:仿微信图片选择器

仿微信图片选择器: 一.项目整体分析: 1. Android加载图片的3个目标: (1)尽可能的去避免内存溢出. a. 根据图片的显示大小去压缩图片 b. 使用缓存对我们图片进行管理(LruCache) (2)用户操作UI控件必须充分的流畅. a. getView里面尽可能不去做耗时的操作(异步加载 + 回调显示) (3)用户预期显示的图片尽可能的快(图片的加载策略的选择,一般选择是LIFO). a. LIFO 2. 定义一个Imageloader完成上面1中的3个目标: Imageloader