編輯:關於Android編程
我是完全根據這裡仿制了一個作為備忘,可以點擊這裡查看原始版本
代碼如下:
1、res/values/attrs.xml
public class RoundProgressBar extends View { private Paint mPaint; private int mRoundColor; private int mProgressColor; private int mTextColor; private int mTextSize; private float mRounWidth; private int mMaxProgress; private int mCurrentProgress = 45; private boolean mTextIsDisplayable; private int mStyle = 1; private static final int STROKE = 0; private static final int FILL =1; public RoundProgressBar(Context context) { this(context, null); } public RoundProgressBar(Context context, AttributeSet attrs) { this(context, attrs, 0); } public RoundProgressBar(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); mPaint = new Paint(); TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.RoundProgressBar); mRoundColor = typedArray.getColor(R.styleable.RoundProgressBar_roundColor, Color.RED); mProgressColor = typedArray.getColor(R.styleable.RoundProgressBar_roundProgressColor, Color.GREEN); mTextColor = typedArray.getColor(R.styleable.RoundProgressBar_textColor, Color.BLUE); mTextSize = typedArray.getDimensionPixelSize(R.styleable.RoundProgressBar_textSize, 15); mRounWidth = typedArray.getDimensionPixelSize(R.styleable.RoundProgressBar_roundWidth, 5); mMaxProgress = typedArray.getInt(R.styleable.RoundProgressBar_max, 100); mTextIsDisplayable = typedArray.getBoolean(R.styleable.RoundProgressBar_textIsDisplayable, true); mStyle = typedArray.getInt(R.styleable.RoundProgressBar_style, STROKE); typedArray.recycle(); } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); // Draw outer circle int center = getWidth() / 2; int radius = (int) (center - mRounWidth / 2); mPaint.setColor(mRoundColor); mPaint.setStyle(Paint.Style.STROKE); mPaint.setStrokeWidth(mRounWidth); mPaint.setAntiAlias(true); canvas.drawCircle(center, center, radius, mPaint); // Draw progress mPaint.setStrokeWidth(mRounWidth); mPaint.setColor(mProgressColor); RectF oval = new RectF(center - radius, center - radius, center + radius, center + radius); switch (mStyle) { case STROKE: mPaint.setStyle(Paint.Style.STROKE); canvas.drawArc(oval, 0, 360 * mCurrentProgress / mMaxProgress, false, mPaint); break; case FILL: mPaint.setStyle(Paint.Style.FILL_AND_STROKE); if (mCurrentProgress != 0) { canvas.drawArc(oval, 0, 360 * mCurrentProgress / mMaxProgress, true, mPaint); } break; default: break; } mPaint.setStrokeWidth(0); mPaint.setColor(mTextColor); mPaint.setTextSize(mTextSize); mPaint.setTypeface(Typeface.DEFAULT); int percent = (int) (((float) mCurrentProgress / (float) mMaxProgress) * 100); float textWidth = mPaint.measureText(percent + "%"); if (percent != 0 && mTextIsDisplayable) { canvas.drawText(percent + "%", center - textWidth / 2, center + mTextSize / 2, mPaint); } } public int getRoundColor() { return mRoundColor; } public void setRoundColor(int roundColor) { this.mRoundColor = roundColor; } public int getProgressColor() { return mProgressColor; } public void setProgressColor(int progressColor) { this.mProgressColor = progressColor; } public int getTextColor() { return mTextColor; } public void setTextColor(int textColor) { this.mTextColor = textColor; } public int getTextSize() { return mTextSize; } public void setTextSize(int textSize) { this.mTextSize = textSize; } public float getRounWidth() { return mRounWidth; } public void setmRounWidth(float mRounWidth) { this.mRounWidth = mRounWidth; } public synchronized int getMaxProgress() { return mMaxProgress; } public synchronized void setMaxProgress(int maxProgress) { if (maxProgress < 0) { throw new IllegalArgumentException("Max Progress not less than 0"); } this.mMaxProgress = maxProgress; } public synchronized int getCurrentProgress() { return mCurrentProgress; } public synchronized void setCurrentProgress(int currentProgress) { if (currentProgress < 0) { throw new IllegalArgumentException("Progress not less than 0"); } if (currentProgress > mMaxProgress) { currentProgress = mMaxProgress; } if (currentProgress <= mMaxProgress) { this.mCurrentProgress = currentProgress; postInvalidate(); } } public boolean isTextIsDisplayable() { return mTextIsDisplayable; } public void setTextDisplayable(boolean displayable) { this.mTextIsDisplayable = displayable; } public int getStyle() { return mStyle; } public void setStyle(int style) { this.mStyle = style; } }
3、布局文件中使用
<framelayout android:layout_height="match_parent" android:layout_width="match_parent" tools:context="com.example.gaussianblur.MainActivity" xmlns:android="http://schemas.android.com/apk/res/android" xmlns:android_custom="http://schemas.android.com/apk/res/com.example.demo" xmlns:tools="http://schemas.android.com/tools"></framelayout>
4、效果圖
概述Android開發涉及到的數據庫采用的是輕量級的SQLite3,而在實際開發中,在存儲一些簡單的數據,使用SharedPreferences就足夠了,只有在存儲數據結
模糊搜索框。APP需要一個該控件,安卓端。先上個圖,看起來不錯的效果。圖一為未點擊狀態,圖二為點擊之後的狀態。圖三為輸入之後的狀態。主要的功能點有 :1、點擊直接懸浮層,
前言項目中有使用到水印效果,如下圖所示。在實現過程中,最終選用ItemDecoration來實現,其中有兩大步驟:自定義Drawable來完成水印圖片、使用ItemDec
最近在做Android應用的混淆,踩了一些坑,這裡記錄分享下個人的心得。混淆介紹首先先簡單說一下什麼是混淆和混淆的作用,其實這個搜索下可以找到一堆官方的說法等等,這裡簡單