編輯:關於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>
運行效果圖:
美圖秀秀濾鏡之對比度,秀秀濾鏡對比度 對比度指的是一幅圖像中明暗區域最亮的白和最暗的黑之間不同亮度層級的測量,即指一幅圖像灰度反差的大小。 在GPUImage中通過
RecyclerView,androidrecyclerview1.簡介 RecyclerView是一種新的視圖組,目標是為任何基於適配器的視圖提供相似的渲染方式。它
阿裡巴巴開源Weex 開發教程,開源weexWeex 是什麼 Weex是阿裡發布的一款用WEB方式開發原生app的開源產品 Weex能夠完美兼顧性能與動態性,讓移動開發者
Android Studio多渠道打包 我們開發一個APP在上傳應用市場之前,有時候會遇到要根據不同平台打多個apk包的問題。由於Android的應用市場比較多,主流的應