做安卓开发的朋友们,不知道你们会不会经常用遇到这样的情景,某个做所畏的产品设计的sb,拿着iphone来看给你看,说看苹果的这个效果多好,看那个效果多好。苹果也比安卓清晰多了,你能不能也把咱们的安卓应用也做成这种效果的。那样的用户体验更好,更cool一些。不知你们有没有遇到过这样半吊子的sb设计,反正我是遇到了。所以本文由此而生。

进入正题:首先你要实现弹性效果的view要能确定什么时候应该出现下拉的效果,什么时候出现下推的效果。在代码里的体现就是你要实现IScrollOverable接口。本文中的例子就拿GridView来做个例子。

无图无真相:

安卓弹性刷新通用版—支持任何view上下刷新均有弹性效果_移动开发  安卓弹性刷新通用版—支持任何view上下刷新均有弹性效果_android开发_02

实现了IScrollOverable接口的GridView:

 

public class BshSOGridView extends GridView implements                  IScrollOverable  {          public BshSOGridView(Context context, AttributeSet attrs,                          int defStyle)          {                 super( context, attrs, defStyle );         }             public BshSOGridView(Context context, AttributeSet attrs)          {                  super( context, attrs );          }           public BshSOGridView(Context context)        {                  super( context );        }           @Override          public boolean isScrollOnTop()          {                return 0 == getFirstVisiblePosition() ? true : false;          }           @Override          public boolean isScrollOnBtm()          {                  return (getCount() - 1) == getLastVisiblePosition() ? true : false;          }  }  

调用Activity:

public class BshSOViewActivity extends Activity {            BshElasticView ev;        BshSOGridView gv;          GridAdagper ga = new GridAdagper();          @Override          public void onCreate(Bundle savedInstanceState)          {                  super.onCreate( savedInstanceState );                  setContentView( R.layout.elastic_grid );                  ev = ( BshElasticView ) findViewById( R.id.ev );                  //拉动幅度                  ev.setFactor( 2 );                  //拉动范围                  ev.setMaxElastic( 0.9f );                 gv = new BshSOGridView( this );                  gv.setBackgroundColor( Color.WHITE );                  gv.setNumColumns( 4 );                  gv.setAdapter( ga );                  ev.setScrollOverable( gv );                 ev.irefresh = new IRefresh()                  {                          @Override                          public boolean refreshTop()                          {                                  new Thread( new Runnable()                                  {                                         @Override                                          public void run()                                          {                                                  try                                                  {                                                         Log.d( "bsh", "refreshing" );                                                          //在这里做刷新操作读数据神马的。这里用睡觉代替                                                         Thread.sleep( 3000 );                                                   } catch ( InterruptedException e )                                                  {                                                          e.printStackTrace();                                                  }                                                  ev.onRefreshComplete();                                          }                                  } ).start();                                  return false;                          }                           @Override                          public boolean refreshBtm()                         {                                  new Thread( new Runnable()                                  {                                          @Override                                          public void run()                                          {                                                 try                                                  {                                                         Log.d( "bsh", "refreshing" );                                                          Thread.sleep( 3000 );                                                  } catch ( InterruptedException e )                                                  {                                                         e.printStackTrace();                                                 }                                                  ev.onRefreshComplete();                                          }                                  } ).start();                                 return false;                          }                  };          }           class GridAdagper extends BaseAdapter          {                   @Override
public int getCount() {
return 100; } @Override public Object getItem(int arg0) { return null; } @Override public long getItemId(int arg0) { return 0; } @Override public View getView(int arg0, View arg1, ViewGroup arg2) { if ( null == arg1 ) { arg1 = new ImageView( BshSOViewActivity.this ); arg1.setBackgroundResource( R.drawable.ic_launcher ); } return arg1; } } }

×××