listview imageview scrollview自定义效果

1,listview

[java]  view plain copy
  1. public class MyListView extends ListView implements Runnable {  
  2.       
  3.     private float mLastDownY = 0f;   
  4.     private int mDistance = 0;   
  5.     private int mStep = 10;   
  6.     private boolean mPositive = false;   
  7.    
  8.   
  9.     public MyListView (Context context, AttributeSet attrs) {   
  10.           super(context, attrs);   
  11.     }   
  12.    
  13.     public MyListView (Context context, AttributeSet attrs, int defStyle) {   
  14.           super(context, attrs, defStyle);   
  15.     }   
  16.    
  17.     public MyListView (Context context) {   
  18.           super(context);   
  19.     }   
  20.    
  21.       
  22.     @Override   
  23.     public boolean onTouchEvent(MotionEvent event) {   
  24.          switch (event.getAction()) {   
  25.               case MotionEvent.ACTION_DOWN:   
  26.                    if (mLastDownY == 0f && mDistance == 0) {   
  27.                          mLastDownY = event.getY();   
  28.                    return true;   
  29.               }   
  30.               break;   
  31.            
  32.               case MotionEvent.ACTION_CANCEL:   
  33.                    break;  
  34.           
  35.               case MotionEvent.ACTION_UP:   
  36.                   if (mDistance != 0) {   
  37.                    mStep = 1;   
  38.                    mPositive = (mDistance >= 0);   
  39.                    this.post(this);   
  40.                    return true;   
  41.                 }   
  42.                  mLastDownY = 0f;   
  43.                  mDistance = 0;   
  44.                  break;   
  45.            
  46.               case MotionEvent.ACTION_MOVE:   
  47.                  if (mLastDownY != 0f) {   
  48.                       mDistance = (int) (mLastDownY - event.getY());   
  49.                       if ((mDistance < 0 && getFirstVisiblePosition() == 0 && getChildAt(0).getTop() == 0) || (mDistance > 0 && getLastVisiblePosition() == getCount() - 1)) {   
  50.                            mDistance /= 2;   
  51.                            scrollTo(0, mDistance);   
  52.                            return true;   
  53.                        }   
  54.                 }   
  55.         mDistance = 0;   
  56.         break;   
  57.         }   
  58.         return super.onTouchEvent(event);   
  59.     }   
  60.    
  61.     public void run() {   
  62.           mDistance += mDistance > 0 ? -mStep : mStep;   
  63.           scrollTo(0, mDistance);   
  64.           if ((mPositive && mDistance <= 0) || (!mPositive && mDistance >= 0)) {   
  65.                 scrollTo(00);   
  66.                 mDistance = 0;   
  67.                 mLastDownY = 0f;   
  68.                 return;   
  69.            }   
  70.           mStep += 1;   
  71.           this.postDelayed(this10);   
  72.      }   
  73. }   

2.scrollview

[java]  view plain copy
  1. public class CustomScrollView extends ScrollView {  
  2.   
  3.     private View inner;// 孩子View  
  4.   
  5.     private float y;// 点击时y坐标  
  6.   
  7.     private Rect normal = new Rect();// 矩形(这里只是个形式,只是用于判断是否需要动画.)  
  8.   
  9.     private boolean isCount = false;// 是否开始计算  
  10.   
  11.     private boolean isMoveing = false;// 是否开始移动.  
  12.   
  13.     private ImageView imageView;  
  14.   
  15.     private int initTop, initbottom;// 初始高度  
  16.     private int top, bottom;// 拖动时时高度。  
  17.   
  18.     public void setImageView(ImageView imageView) {  
  19.         this.imageView = imageView;  
  20.     }  
  21.   
  22.     public CustomScrollView(Context context, AttributeSet attrs) {  
  23.         super(context, attrs);  
  24.     }  
  25.   
  26.     /*** 
  27.      * 根据 XML 生成视图工作完成.该函数在生成视图的最后调用,在所有子视图添加完之后. 即使子类覆盖了 onFinishInflate 
  28.      * 方法,也应该调用父类的方法,使该方法得以执行. 
  29.      */  
  30.     @Override  
  31.     protected void onFinishInflate() {  
  32.         if (getChildCount() > 0) {  
  33.             inner = getChildAt(0);  
  34.         }  
  35.     }  
  36.   
  37.     /** touch 事件处理 **/  
  38.     @Override  
  39.     public boolean onTouchEvent(MotionEvent ev) {  
  40.         if (inner != null) {  
  41.             commOnTouchEvent(ev);  
  42.         }  
  43.         return super.onTouchEvent(ev);  
  44.     }  
  45.   
  46.     /*** 
  47.      * 触摸事件 
  48.      *  
  49.      * @param ev 
  50.      */  
  51.     public void commOnTouchEvent(MotionEvent ev) {  
  52.         int action = ev.getAction();  
  53.         switch (action) {  
  54.         case MotionEvent.ACTION_DOWN:  
  55.             top = initTop = imageView.getTop();  
  56.             bottom = initbottom = imageView.getBottom();  
  57.             break;  
  58.   
  59.         case MotionEvent.ACTION_UP:  
  60.   
  61.             isMoveing = false;  
  62.             // 手指松开.  
  63.             if (isNeedAnimation()) {  
  64.   
  65.                 animation();  
  66.   
  67.             }  
  68.             break;  
  69.         /*** 
  70.          * 排除出第一次移动计算,因为第一次无法得知y坐标, 在MotionEvent.ACTION_DOWN中获取不到, 
  71.          * 因为此时是MyScrollView的touch事件传递到到了LIstView的孩子item上面.所以从第二次计算开始. 
  72.          * 然而我们也要进行初始化,就是第一次移动的时候让滑动距离归0. 之后记录准确了就正常执行. 
  73.          */  
  74.         case MotionEvent.ACTION_MOVE:  
  75.   
  76.             final float preY = y;// 按下时的y坐标  
  77.   
  78.             float nowY = ev.getY();// 时时y坐标  
  79.             int deltaY = (int) (nowY - preY);// 滑动距离  
  80.             if (!isCount) {  
  81.                 deltaY = 0// 在这里要归0.  
  82.             }  
  83.   
  84.             if (deltaY < 0 && top <= initTop)  
  85.                 return;  
  86.   
  87.             // 当滚动到最上或者最下时就不会再滚动,这时移动布局  
  88.             isNeedMove();  
  89.   
  90.             if (isMoveing) {  
  91.                 // 初始化头部矩形  
  92.                 if (normal.isEmpty()) {  
  93.                     // 保存正常的布局位置  
  94.                     normal.set(inner.getLeft(), inner.getTop(),  
  95.                             inner.getRight(), inner.getBottom());  
  96.                 }  
  97.   
  98.                 // 移动布局  
  99.                 inner.layout(inner.getLeft(), inner.getTop() + deltaY / 3,  
  100.                         inner.getRight(), inner.getBottom() + deltaY / 3);  
  101.   
  102.                 top += (deltaY / 6);  
  103.                 bottom += (deltaY / 6);  
  104.                 imageView.layout(imageView.getLeft(), top,  
  105.                         imageView.getRight(), bottom);  
  106.             }  
  107.   
  108.             isCount = true;  
  109.             y = nowY;  
  110.             break;  
  111.   
  112.         default:  
  113.             break;  
  114.   
  115.         }  
  116.     }  
  117.   
  118.     /*** 
  119.      * 回缩动画 
  120.      */  
  121.     public void animation() {  
  122.   
  123.         TranslateAnimation taa = new TranslateAnimation(00, top + 200,  
  124.                 initTop + 200);  
  125.         taa.setDuration(200);  
  126.         imageView.startAnimation(taa);  
  127.         imageView.layout(imageView.getLeft(), initTop, imageView.getRight(),  
  128.                 initbottom);  
  129.   
  130.         // 开启移动动画  
  131.         TranslateAnimation ta = new TranslateAnimation(00, inner.getTop(),  
  132.                 normal.top);  
  133.         ta.setDuration(200);  
  134.         inner.startAnimation(ta);  
  135.         // 设置回到正常的布局位置  
  136.         inner.layout(normal.left, normal.top, normal.right, normal.bottom);  
  137.         normal.setEmpty();  
  138.   
  139.         isCount = false;  
  140.         y = 0;// 手指松开要归0.  
  141.   
  142.     }  
  143.   
  144.     // 是否需要开启动画  
  145.     public boolean isNeedAnimation() {  
  146.         return !normal.isEmpty();  
  147.     }  
  148.   
  149.     /*** 
  150.      * 是否需要移动布局 inner.getMeasuredHeight():获取的是控件的总高度 
  151.      *  
  152.      * getHeight():获取的是屏幕的高度 
  153.      *  
  154.      * @return 
  155.      */  
  156.     public void isNeedMove() {  
  157.         int offset = inner.getMeasuredHeight() - getHeight();  
  158.         int scrollY = getScrollY();  
  159.         // Log.e("jj", "scrolly=" + scrollY);  
  160.         // 0是顶部,后面那个是底部  
  161.         if (scrollY == 0 || scrollY == offset) {  
  162.             isMoveing = true;  
  163.         }  
  164.     }  
  165.   
  166. }  


3. 保证长宽比 缩放使图片不失真的 imageview

[java]  view plain copy
  1. public class RoundedImageView extends ImageView {  
  2.   
  3.     public RoundedImageView(Context context) {  
  4.         super(context);  
  5.         // TODO Auto-generated constructor stub  
  6.     }  
  7.   
  8.     public RoundedImageView(Context context, AttributeSet attrs) {  
  9.         super(context, attrs);  
  10.     }  
  11.   
  12.     public RoundedImageView(Context context, AttributeSet attrs, int defStyle) {  
  13.         super(context, attrs, defStyle);  
  14.     }  
  15.   
  16.     @Override  
  17.     protected void onDraw(Canvas canvas) {  
  18.   
  19.         Drawable drawable = getDrawable();  
  20.   
  21.         if (drawable == null) {  
  22.             return;  
  23.         }  
  24.   
  25.         if (getWidth() == 0 || getHeight() == 0) {  
  26.             return;  
  27.         }  
  28.         Bitmap b = ((BitmapDrawable) drawable).getBitmap();  
  29.         Bitmap bitmap = b.copy(Bitmap.Config.ARGB_8888, true);  
  30.   
  31.         int w = getWidth(), h = getHeight();  
  32.   
  33.         Bitmap roundBitmap = getCroppedBitmap(bitmap, w);  
  34.         canvas.drawBitmap(roundBitmap, 00null);  
  35.   
  36.     }  
  37.   
  38.       
  39.     public static Bitmap getCroppedBitmap(Bitmap bmp, int radius) {  
  40.         Bitmap sbmp;  
  41.         if (bmp.getWidth() != radius || bmp.getHeight() != radius)  
  42.             sbmp = Bitmap.createScaledBitmap(bmp, radius, radius, false);  
  43.         else  
  44.             sbmp = bmp;  
  45.         Bitmap output = Bitmap.createBitmap(sbmp.getWidth(), sbmp.getHeight(),  
  46.                 Config.ARGB_8888);  
  47.         Canvas canvas = new Canvas(output);  
  48.   
  49.         final int color = 0xffa19774;  
  50.         final Paint paint = new Paint();  
  51.         final Rect rect = new Rect(00, sbmp.getWidth(), sbmp.getHeight());  
  52.   
  53.         paint.setAntiAlias(true);  
  54.         paint.setFilterBitmap(true);  
  55.         paint.setDither(true);  
  56.         canvas.drawARGB(0000);  
  57.         paint.setColor(Color.parseColor("#BAB399"));  
  58.         canvas.drawCircle(sbmp.getWidth() / 2 + 0.7f,  
  59.                 sbmp.getHeight() / 2 + 0.7f, sbmp.getWidth() / 2 + 0.1f, paint);  
  60.         paint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN));  
  61.         canvas.drawBitmap(sbmp, rect, rect, paint);  
  62.   
  63.         return output;  
  64.     }  
  65.   
  66. }  
比如 设置 imageview的 w,h

[html]  view plain copy
  1. <com.example.view.RoundedImageView  
  2.            android:layout_width="wrap_content"  
  3.            android:layout_height="wrap_content"  
  4.            android:layout_gravity="center_horizontal"  
  5.            android:adjustViewBounds="true"  
  6.            android:maxHeight="80dip"  
  7.            android:maxWidth="80dip"  
  8.            android:src="@drawable/aa" />  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值