Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> Android開發 >> 關於android開發 >> Android的SwipeToDismiss第三方開源框架模擬QQ對話列表側滑刪除,置頂,將頭像圖片圓形化處理。,android第三方側滑

Android的SwipeToDismiss第三方開源框架模擬QQ對話列表側滑刪除,置頂,將頭像圖片圓形化處理。,android第三方側滑

編輯:關於android開發

Android的SwipeToDismiss第三方開源框架模擬QQ對話列表側滑刪除,置頂,將頭像圖片圓形化處理。,android第三方側滑



 

《Android SwipeToDismiss:左右滑動刪除ListView條目Item》

Android的SwipeToDismiss是github上一個第三方開源框架(github上的項目鏈接地址:https://github.com/romannurik/Android-SwipeToDismiss )。該開源項目旨在:使得一個ListView的item在用戶的手指在屏幕上左滑或者右滑時候,刪除當前的這個ListView Item。

下載地址:點此下載

將開源框架文件加入這裡:

將圖片圓形化處理的類:CircleImageView

  1 package com.lixu.qqchehua; 
  2 
  3 import android.content.Context;  
  4 import android.content.res.TypedArray;  
  5 import android.graphics.Bitmap;  
  6 import android.graphics.BitmapShader;  
  7 import android.graphics.Canvas;  
  8 import android.graphics.Color;  
  9 import android.graphics.Matrix;  
 10 import android.graphics.Paint;  
 11 import android.graphics.Paint.Align;  
 12 import android.graphics.Rect;  
 13 import android.graphics.RectF;  
 14 import android.graphics.Shader;  
 15 import android.graphics.SweepGradient;  
 16 import android.graphics.drawable.BitmapDrawable;  
 17 import android.graphics.drawable.ColorDrawable;  
 18 import android.graphics.drawable.Drawable;  
 19 import android.net.Uri;  
 20 import android.text.TextPaint;  
 21 import android.util.AttributeSet;
 22 import android.util.FloatMath;
 23 import android.widget.ImageView;  
 24   
 25 /** 
 26  * @author Phil 
 27  * 
 28  */  
 29 public class CircleImageView extends ImageView {  
 30   
 31     private static final ScaleType SCALE_TYPE = ScaleType.CENTER_CROP;  
 32   
 33     private static final Bitmap.Config BITMAP_CONFIG = Bitmap.Config.ARGB_8888;  
 34     private static final int COLORDRAWABLE_DIMENSION = 2;  
 35   
 36     // 圓形邊框的厚度默認值。  
 37     // 如果是0,則沒有天藍色漸變的邊框。  
 38     private static final int DEFAULT_BORDER_WIDTH = 0;  
 39   
 40     private static final int DEFAULT_BORDER_COLOR = Color.BLACK;  
 41   
 42     private final RectF mDrawableRect = new RectF();  
 43     private final RectF mBorderRect = new RectF();  
 44   
 45     private final Matrix mShaderMatrix = new Matrix();  
 46     private final Paint mBitmapPaint = new Paint();  
 47     private final Paint mBorderPaint = new Paint();  
 48   
 49     private int mBorderColor = DEFAULT_BORDER_COLOR;  
 50     private int mBorderWidth = DEFAULT_BORDER_WIDTH;  
 51   
 52     private Bitmap mBitmap;  
 53     private BitmapShader mBitmapShader;  
 54     private int mBitmapWidth;  
 55     private int mBitmapHeight;  
 56   
 57     private float mDrawableRadius;  
 58     private float mBorderRadius;  
 59   
 60     private boolean mReady;  
 61     private boolean mSetupPending;  
 62     private final Paint mFlagBackgroundPaint = new Paint();  
 63     private final TextPaint mFlagTextPaint = new TextPaint();  
 64     private String mFlagText;  
 65     private boolean mShowFlag = false;  
 66     private Rect mFlagTextBounds = new Rect();  
 67   
 68     Shader mSweepGradient = null;  
 69   
 70     public CircleImageView(Context context) {  
 71         super(context);  
 72   
 73         init();  
 74     }  
 75   
 76     public CircleImageView(Context context, AttributeSet attrs) {  
 77         this(context, attrs, 0);  
 78     }  
 79   
 80     public CircleImageView(Context context, AttributeSet attrs, int defStyle) {  
 81         super(context, attrs, defStyle);  
 82   
 83         // TypedArray a = context.obtainStyledAttributes(attrs,  
 84         // R.styleable.CircleImageView, defStyle, 0);  
 85         //  
 86         // mBorderWidth =  
 87         // a.getDimensionPixelSize(R.styleable.CircleImageView_border_width,  
 88         // DEFAULT_BORDER_WIDTH);  
 89         // mBorderColor = a.getColor(R.styleable.CircleImageView_border_color,  
 90         // DEFAULT_BORDER_COLOR);  
 91         //  
 92         // a.recycle();  
 93   
 94         init();  
 95     }  
 96   
 97     private void init() {  
 98         super.setScaleType(SCALE_TYPE);  
 99         mReady = true;  
100   
101         if (mSetupPending) {  
102             setup();  
103             mSetupPending = false;  
104         }  
105     }  
106   
107     @Override  
108     public ScaleType getScaleType() {  
109         return SCALE_TYPE;  
110     }  
111   
112     @Override  
113     public void setScaleType(ScaleType scaleType) {  
114         if (scaleType != SCALE_TYPE) {  
115             throw new IllegalArgumentException(String.format(  
116                     "ScaleType %s not supported.", scaleType));  
117         }  
118     }  
119   
120     @Override  
121     public void setAdjustViewBounds(boolean adjustViewBounds) {  
122         if (adjustViewBounds) {  
123             throw new IllegalArgumentException(  
124                     "adjustViewBounds not supported.");  
125         }  
126     }  
127   
128     @SuppressWarnings("deprecation")
129     @Override  
130     protected void onDraw(Canvas canvas) {  
131         if (getDrawable() == null) {  
132             return;  
133         }  
134   
135         canvas.drawCircle(getWidth() / 2, getHeight() / 2, mDrawableRadius,  
136                 mBitmapPaint);  
137         if (mBorderWidth != 0) {  
138             canvas.save();  
139             canvas.rotate(20, getWidth() / 2, getHeight() / 2);  
140             canvas.drawCircle(getWidth() / 2, getHeight() / 2, mBorderRadius,  
141                     mBorderPaint);  
142             canvas.restore();  
143         }  
144   
145         if (mShowFlag && mFlagText != null) {  
146             canvas.drawArc(mBorderRect, 40, 100, false, mFlagBackgroundPaint);  
147             mFlagTextPaint.getTextBounds(mFlagText, 0, mFlagText.length(),  
148                     mFlagTextBounds);  
149             canvas.drawText(mFlagText, getWidth() / 2,  
150                     (3 + FloatMath.cos((float) (Math.PI * 5 / 18)))  
151                             * getHeight() / 4 + mFlagTextBounds.height() / 3,  
152                     mFlagTextPaint);  
153         }  
154   
155     }  
156   
157     @Override  
158     protected void onSizeChanged(int w, int h, int oldw, int oldh) {  
159         super.onSizeChanged(w, h, oldw, oldh);  
160         setup();  
161     }  
162   
163     public int getBorderColor() {  
164         return mBorderColor;  
165     }  
166   
167     public void setBorderColor(int borderColor) {  
168         if (borderColor == mBorderColor) {  
169             return;  
170         }  
171   
172         mBorderColor = borderColor;  
173         mBorderPaint.setColor(mBorderColor);  
174         invalidate();  
175     }  
176   
177     public int getBorderWidth() {  
178         return mBorderWidth;  
179     }  
180   
181     /** 
182      * @param borderWidth 
183      *            圓形的邊框厚度。 
184      */  
185     public void setBorderWidth(int borderWidth) {  
186         if (borderWidth == mBorderWidth) {  
187             return;  
188         }  
189   
190         mBorderWidth = borderWidth;  
191         setup();  
192     }  
193   
194     @Override  
195     public void setImageBitmap(Bitmap bm) {  
196         super.setImageBitmap(bm);  
197         mBitmap = bm;  
198         setup();  
199     }  
200   
201     @Override  
202     public void setImageDrawable(Drawable drawable) {  
203         super.setImageDrawable(drawable);  
204         mBitmap = getBitmapFromDrawable(drawable);  
205         setup();  
206     }  
207   
208     @Override  
209     public void setImageResource(int resId) {  
210         super.setImageResource(resId);  
211         mBitmap = getBitmapFromDrawable(getDrawable());  
212         setup();  
213     }  
214   
215     @Override  
216     public void setImageURI(Uri uri) {  
217         super.setImageURI(uri);  
218         mBitmap = getBitmapFromDrawable(getDrawable());  
219         setup();  
220     }  
221   
222     private Bitmap getBitmapFromDrawable(Drawable drawable) {  
223         if (drawable == null) {  
224             return null;  
225         }  
226   
227         if (drawable instanceof BitmapDrawable) {  
228             return ((BitmapDrawable) drawable).getBitmap();  
229         }  
230   
231         try {  
232             Bitmap bitmap;  
233   
234             if (drawable instanceof ColorDrawable) {  
235                 bitmap = Bitmap.createBitmap(COLORDRAWABLE_DIMENSION,  
236                         COLORDRAWABLE_DIMENSION, BITMAP_CONFIG);  
237             } else {  
238                 bitmap = Bitmap.createBitmap(drawable.getIntrinsicWidth(),  
239                         drawable.getIntrinsicHeight(), BITMAP_CONFIG);  
240             }  
241   
242             Canvas canvas = new Canvas(bitmap);  
243             drawable.setBounds(0, 0, canvas.getWidth(), canvas.getHeight());  
244             drawable.draw(canvas);  
245             return bitmap;  
246         } catch (OutOfMemoryError e) {  
247             return null;  
248         }  
249     }  
250   
251     private void setup() {  
252         if (!mReady) {  
253             mSetupPending = true;  
254             return;  
255         }  
256   
257         if (mBitmap == null) {  
258             return;  
259         }  
260   
261         mBitmapShader = new BitmapShader(mBitmap, Shader.TileMode.CLAMP,  
262                 Shader.TileMode.CLAMP);  
263   
264         mBitmapPaint.setAntiAlias(true);  
265         mBitmapPaint.setShader(mBitmapShader);  
266   
267         mBorderPaint.setStyle(Paint.Style.STROKE);  
268         mBorderPaint.setAntiAlias(true);  
269         mBorderPaint.setColor(mBorderColor);  
270         mBorderPaint.setStrokeWidth(mBorderWidth);  
271   
272         mBitmapHeight = mBitmap.getHeight();  
273         mBitmapWidth = mBitmap.getWidth();  
274   
275         mBorderRect.set(0, 0, getWidth(), getHeight());  
276         mBorderRadius = Math.min((mBorderRect.height() - mBorderWidth) / 2,  
277                 (mBorderRect.width() - mBorderWidth) / 2);  
278   
279         mDrawableRect.set(mBorderWidth, mBorderWidth, mBorderRect.width()  
280                 - mBorderWidth, mBorderRect.height() - mBorderWidth);  
281         mDrawableRadius = Math.min(mDrawableRect.height() / 2,  
282                 mDrawableRect.width() / 2);  
283   
284         mFlagBackgroundPaint.setColor(Color.BLACK & 0x66FFFFFF);  
285         mFlagBackgroundPaint.setFlags(TextPaint.ANTI_ALIAS_FLAG);  
286   
287         mFlagTextPaint.setFlags(TextPaint.ANTI_ALIAS_FLAG);  
288         mFlagTextPaint.setTextAlign(Align.CENTER);  
289         mFlagTextPaint.setColor(Color.WHITE);  
290         mFlagTextPaint  
291                 .setTextSize(getResources().getDisplayMetrics().density * 18);  
292   
293         mSweepGradient = new SweepGradient(getWidth() / 2, getHeight() / 2,  
294                 new int[] { Color.rgb(255, 255, 255), Color.rgb(1, 209, 255) },  
295                 null);  
296   
297         mBorderPaint.setShader(mSweepGradient);  
298   
299         updateShaderMatrix();  
300         invalidate();  
301     }  
302   
303     private void updateShaderMatrix() {  
304         float scale;  
305         float dx = 0;  
306         float dy = 0;  
307   
308         mShaderMatrix.set(null);  
309   
310         if (mBitmapWidth * mDrawableRect.height() > mDrawableRect.width()  
311                 * mBitmapHeight) {  
312             scale = mDrawableRect.height() / (float) mBitmapHeight;  
313             dx = (mDrawableRect.width() - mBitmapWidth * scale) * 0.5f;  
314         } else {  
315             scale = mDrawableRect.width() / (float) mBitmapWidth;  
316             dy = (mDrawableRect.height() - mBitmapHeight * scale) * 0.5f;  
317         }  
318   
319         mShaderMatrix.setScale(scale, scale);  
320         mShaderMatrix.postTranslate((int) (dx + 0.5f) + mBorderWidth,  
321                 (int) (dy + 0.5f) + mBorderWidth);  
322   
323         mBitmapShader.setLocalMatrix(mShaderMatrix);  
324     }  
325   
326     public void setShowFlag(boolean show) {  
327         mShowFlag = show;  
328         invalidate();  
329     }  
330   
331     public void setFlagText(String text) {  
332         mFlagText = text;  
333         invalidate();  
334     }  
335 }

代碼如下:

  1 package com.lixu.qqchehua;
  2 
  3 import java.util.ArrayList;
  4 import com.baoyz.swipemenulistview.SwipeMenu;
  5 import com.baoyz.swipemenulistview.SwipeMenuCreator;
  6 import com.baoyz.swipemenulistview.SwipeMenuItem;
  7 import com.baoyz.swipemenulistview.SwipeMenuListView;
  8 import com.baoyz.swipemenulistview.SwipeMenuListView.OnMenuItemClickListener;
  9 import android.app.Activity;
 10 import android.content.Context;
 11 import android.graphics.Color;
 12 import android.graphics.drawable.ColorDrawable;
 13 import android.os.Bundle;
 14 import android.view.LayoutInflater;
 15 import android.view.View;
 16 import android.view.ViewGroup;
 17 import android.widget.ArrayAdapter;
 18 import android.widget.ImageView;
 19 import android.widget.TextView;
 20 import android.widget.Toast;
 21 
 22 public class MainActivity extends Activity {
 23     private ArrayList<String> data;
 24     private MyAdapter mMyAdapter;
 25 
 26     @Override
 27     protected void onCreate(Bundle savedInstanceState) {
 28         super.onCreate(savedInstanceState);
 29         setContentView(R.layout.activity_main);
 30         // 添加文字數據模擬QQ對話
 31         String[] str = { "今天天氣不錯!", "你好啊,在嗎?", "朋友有空出來完。", "走,出去嗨!", "帥哥有空嗎?", "來家裡玩。", "QQ群有新動態。", "騰訊新聞:伊拉克發動戰爭!",
 32                 "QQ紅包,快來領", "QQ健康", "QQ郵箱" };
 33         data = new ArrayList<String>();
 34 
 35         for (String n : str)
 36             data.add(n);
 37         // 創建側滑提示框
 38         SwipeMenuCreator creator = new SwipeMenuCreator() {
 39 
 40             @Override
 41             public void create(SwipeMenu menu) {
 42                 // 設置置頂框
 43                 SwipeMenuItem zhidingitem = new SwipeMenuItem(getApplicationContext());
 44                 zhidingitem.setBackground(new ColorDrawable(Color.GRAY));
 45                 zhidingitem.setWidth(dp2px(90));
 46                 zhidingitem.setTitle("置頂");
 47                 zhidingitem.setTitleSize(15);
 48                 zhidingitem.setTitleColor(Color.WHITE);
 49                 menu.addMenuItem(zhidingitem);
 50                 // 設置刪除框
 51                 SwipeMenuItem deleteitem = new SwipeMenuItem(getApplicationContext());
 52                 deleteitem.setBackground(new ColorDrawable(Color.RED));
 53                 deleteitem.setWidth(dp2px(90));
 54                 deleteitem.setTitle("刪除");
 55                 deleteitem.setTitleSize(15);
 56                 deleteitem.setTitleColor(Color.WHITE);
 57                 menu.addMenuItem(deleteitem);
 58             }
 59         };
 60         SwipeMenuListView smlv = (SwipeMenuListView) findViewById(R.id.smlv);
 61         // 設置滑動菜單
 62         smlv.setMenuCreator(creator);
 63         // 設置菜單觸摸事件
 64         smlv.setOnMenuItemClickListener(new OnMenuItemClickListener() {
 65 
 66             @Override
 67             public boolean onMenuItemClick(int position, SwipeMenu menu, int index) {
 68                 // int index 這個獲取到提示框 int position獲取列的下標
 69                 switch (index) {
 70                 case 0:
 71                     // 獲取某一列數據後添加到集合頭部
 72                     String str = data.get(position);
 73                     data.remove(position);
 74                     data.add(0, str);
 75                     // 刷新適配器
 76                     mMyAdapter.notifyDataSetChanged();
 77                     Toast.makeText(getApplicationContext(), "置頂成功!", 0).show();
 78                     break;
 79                 case 1:
 80                     // 刪除某一列數據
 81                     data.remove(position);
 82                     // 刷新適配器
 83                     mMyAdapter.notifyDataSetChanged();
 84                     Toast.makeText(getApplicationContext(), "刪除成功!", 0).show();
 85                     break;
 86 
 87                 default:
 88                     break;
 89                 }
 90                 return false;
 91             }
 92         });
 93 
 94         mMyAdapter = new MyAdapter(this, -1);
 95         smlv.setAdapter(mMyAdapter);
 96     }
 97 
 98     private class MyAdapter extends ArrayAdapter {
 99         LayoutInflater flater;
100 
101         public MyAdapter(Context context, int resource) {
102             super(context, resource);
103             flater = LayoutInflater.from(context);
104         }
105 
106         @Override
107         public int getCount() {
108             return data.size();
109         }
110 
111         @Override
112         public View getView(int position, View convertView, ViewGroup parent) {
113             if (convertView == null)
114                 convertView = flater.inflate(R.layout.list, null);
115 
116             ImageView iv = (ImageView) convertView.findViewById(R.id.iv);
117             iv.setImageResource(R.drawable.qqq);
118 
119             TextView tv = (TextView) convertView.findViewById(R.id.tv);
120             tv.setText(data.get(position));
121             return convertView;
122         }
123 
124     }
125 
126     public int dp2px(float dipValue) {
127         final float scale = this.getResources().getDisplayMetrics().density;
128         return (int) (dipValue * scale + 0.5f);
129     }
130 
131 }

xml文件:

 1 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 2     xmlns:tools="http://schemas.android.com/tools"
 3     android:layout_width="match_parent"
 4     android:layout_height="match_parent"
 5     android:orientation="vertical" >
 6 
 7     <com.baoyz.swipemenulistview.SwipeMenuListView
 8         android:id="@+id/smlv"
 9         android:layout_width="match_parent"
10         android:layout_height="match_parent" />
11 
12 </LinearLayout>
 1 <?xml version="1.0" encoding="utf-8"?>
 2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 3     android:layout_width="match_parent"
 4     android:layout_height="match_parent"
 5     android:orientation="horizontal" 
 6     android:padding="10dp">
 7 
 8     <com.lixu.qqchehua.CircleImageView  
 9         android:id="@+id/iv"
10         android:layout_width="50dp"
11         android:layout_height="50dp" />
12 
13     <TextView
14         android:id="@+id/tv"
15         android:layout_width="wrap_content"
16         android:layout_height="wrap_content" />
17 
18 </LinearLayout>


運行效果圖:

 

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved