进度选择器
来源:互联网 发布:蚁群算法python实现 编辑:程序博客网 时间:2024/05/22 05:01
在项目中可能遇到这样的问题,随着自己填写内容不多同时状态选择器就发生改变。(马上把代码pull上面大家可以参考一下)
(1)布局文件
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:background="@color/white" tools:context="com.hdf.etdemo.view.stepview.StepViewActivity" > <com.example.stepviewdemo.StepsView android:id="@+id/stepsView" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginBottom="10dp" android:layout_marginTop="10dp" /> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:onClick="changeStep" android:text="下一步" /></LinearLayout>
( 2 )代码实现
StepsView stepsView = (StepsView) this.findViewById(R.id.stepsView);stepsView.setLabels(labels).setBarColorIndicator(0xFF888888)// 设置未到达步骤的节点颜色.setProgressColorIndicator(0xFF05A9F4)// 设置已到达步骤的节点颜色.setLabelColorIndicator(0xFF888888)// 设置步骤label(文字描述)的字体颜色.setCompletedPosition(0)// 设置已经到达了的节点位置,从0开始标识.drawView();// 重新绘制控件,一般,节点状态发生变化时,调用此方法刷新控件
(3)StepsView
package com.example.stepviewdemo;import java.util.List;import android.annotation.SuppressLint;import android.content.Context;import android.graphics.Color;import android.graphics.Typeface;import android.util.AttributeSet;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import android.widget.FrameLayout;import android.widget.LinearLayout;import android.widget.TextView;public class StepsView extends LinearLayout implements StepsViewIndicator.OnDrawListener { private StepsViewIndicator mStepsViewIndicator; private FrameLayout mLabelsLayout; private String[] mLabels; private int mProgressColorIndicator = Color.YELLOW; private int mLabelColorIndicator = Color.BLACK; private int mBarColorIndicator = Color.BLACK; private int mCompletedPosition = 0; public StepsView(Context context) { this(context, null); } public StepsView(Context context, AttributeSet attrs) { this(context, attrs, 0); } @SuppressLint("NewApi") public StepsView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); init(); } private void init() { View rootView = LayoutInflater.from(getContext()).inflate(R.layout.widget_steps_view, this); mStepsViewIndicator = (StepsViewIndicator) rootView.findViewById(R.id.steps_indicator_view); mStepsViewIndicator.setDrawListener(this); mLabelsLayout = (FrameLayout) rootView.findViewById(R.id.labels_container); } public String[] getLabels() { return mLabels; } public StepsView setLabels(String[] labels) { mLabels = labels; mStepsViewIndicator.setStepSize(labels.length); return this; } public int getProgressColorIndicator() { return mProgressColorIndicator; } public StepsView setProgressColorIndicator(int progressColorIndicator) { mProgressColorIndicator = progressColorIndicator; mStepsViewIndicator.setProgressColor(mProgressColorIndicator); return this; } public int getLabelColorIndicator() { return mLabelColorIndicator; } public StepsView setLabelColorIndicator(int labelColorIndicator) { mLabelColorIndicator = labelColorIndicator; return this; } public int getBarColorIndicator() { return mBarColorIndicator; } public StepsView setBarColorIndicator(int barColorIndicator) { mBarColorIndicator = barColorIndicator; mStepsViewIndicator.setBarColor(mBarColorIndicator); return this; } public int getCompletedPosition() { return mCompletedPosition; } public StepsView setCompletedPosition(int completedPosition) { mCompletedPosition = completedPosition; mStepsViewIndicator.setCompletedPosition(mCompletedPosition); return this; } public void drawView() { if (mLabels == null) { throw new IllegalArgumentException("labels must not be null."); } if (mCompletedPosition < 0 || mCompletedPosition > mLabels.length - 1) { throw new IndexOutOfBoundsException(String.format("Index : %s, Size : %s", mCompletedPosition, mLabels.length)); } mStepsViewIndicator.invalidate(); } @Override public void onReady() { drawLabels(); } @SuppressLint("NewApi") private void drawLabels() { List<Float> indicatorPosition = mStepsViewIndicator.getThumbContainerXPosition(); if (mLabels != null) { for (int i = 0; i < mLabels.length; i++) { TextView textView = new TextView(getContext()); textView.setText(mLabels[i]); textView.setTextColor(mLabelColorIndicator); textView.setX(indicatorPosition.get(i)); textView.setLayoutParams( new ViewGroup.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT)); if (i <= mCompletedPosition) { textView.setTypeface(null, Typeface.BOLD); } mLabelsLayout.addView(textView); } } }}
(4)StepsViewIndicator
package com.example.stepviewdemo;import java.util.ArrayList;import java.util.List;import android.content.Context;import android.content.res.TypedArray;import android.graphics.Canvas;import android.graphics.Color;import android.graphics.Paint;import android.util.AttributeSet;import android.view.View;public class StepsViewIndicator extends View { private static final int THUMB_SIZE = 100; private Paint paint = new Paint(); private Paint selectedPaint = new Paint(); private int mNumOfStep = 2; private float mLineHeight; private float mThumbRadius; private float mCircleRadius; private float mPadding; private int mProgressColor = Color.YELLOW; private int mBarColor = Color.DKGRAY; private float mCenterY; private float mLeftX; private float mLeftY; private float mRightX; private float mRightY; private float mDelta; private List<Float> mThumbContainerXPosition = new ArrayList<Float>(); private int mCompletedPosition; private OnDrawListener mDrawListener; public StepsViewIndicator(Context context) { this(context, null); } public StepsViewIndicator(Context context, AttributeSet attrs) { this(context, attrs, 0); } public StepsViewIndicator(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.StepsViewIndicator); mNumOfStep = a.getInt(R.styleable.StepsViewIndicator_numOfSteps, 0); a.recycle(); init(); } private void init() { mLineHeight = 0.1f * THUMB_SIZE; mThumbRadius = 0.3f * THUMB_SIZE; mCircleRadius = 0.4f * mThumbRadius; mPadding = 0.2f * THUMB_SIZE; } public void setStepSize(int size) { mNumOfStep = size; invalidate(); } public void setDrawListener(OnDrawListener drawListener) { mDrawListener = drawListener; } public List<Float> getThumbContainerXPosition() { return mThumbContainerXPosition; } @Override public void onSizeChanged(int w, int h, int oldw, int oldh) { super.onSizeChanged(w, h, oldw, oldh); mCenterY = 0.5f * getHeight(); mLeftX = mPadding; mLeftY = mCenterY - (mLineHeight / 2); mRightX = getWidth() - mPadding; mRightY = 0.5f * (getHeight() + mLineHeight); mDelta = (mRightX - mLeftX) / (mNumOfStep - 1); mThumbContainerXPosition.add(mLeftX); for (int i = 1; i < mNumOfStep - 1; i++) { mThumbContainerXPosition.add(mLeftX + (i * mDelta)); } mThumbContainerXPosition.add(mRightX); mDrawListener.onReady(); } @Override protected synchronized void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { int width = 200; if (MeasureSpec.UNSPECIFIED != MeasureSpec.getMode(widthMeasureSpec)) { width = MeasureSpec.getSize(widthMeasureSpec); } int height = THUMB_SIZE + 20; if (MeasureSpec.UNSPECIFIED != MeasureSpec.getMode(heightMeasureSpec)) { height = Math.min(height, MeasureSpec.getSize(heightMeasureSpec)); } setMeasuredDimension(width, height); } public void setCompletedPosition(int position) { mCompletedPosition = position; } public void reset() { setCompletedPosition(0); } public void setProgressColor(int progressColor) { mProgressColor = progressColor; } public void setBarColor(int barColor) { mBarColor = barColor; } @Override protected synchronized void onDraw(Canvas canvas) { super.onDraw(canvas); mDrawListener.onReady(); // Draw rect bounds paint.setAntiAlias(true); paint.setColor(mBarColor); paint.setStyle(Paint.Style.STROKE); paint.setStrokeWidth(2); selectedPaint.setAntiAlias(true); selectedPaint.setColor(mProgressColor); selectedPaint.setStyle(Paint.Style.STROKE); selectedPaint.setStrokeWidth(2); // Draw rest of the circle'Bounds for (int i = 0; i < mThumbContainerXPosition.size(); i++) { canvas.drawCircle(mThumbContainerXPosition.get(i), mCenterY, mCircleRadius, (i <= mCompletedPosition) ? selectedPaint : paint); } paint.setStyle(Paint.Style.FILL); selectedPaint.setStyle(Paint.Style.FILL); for (int i = 0; i < mThumbContainerXPosition.size() - 1; i++) { final float pos = mThumbContainerXPosition.get(i); final float pos2 = mThumbContainerXPosition.get(i + 1); canvas.drawRect(pos, mLeftY, pos2, mRightY, (i < mCompletedPosition) ? selectedPaint : paint); } // Draw rest of circle for (int i = 0; i < mThumbContainerXPosition.size(); i++) { final float pos = mThumbContainerXPosition.get(i); canvas.drawCircle(pos, mCenterY, mCircleRadius, (i <= mCompletedPosition) ? selectedPaint : paint); if (i == mCompletedPosition) { selectedPaint.setColor(getColorWithAlpha(mProgressColor, 0.2f)); canvas.drawCircle(pos, mCenterY, mCircleRadius * 1.8f, selectedPaint); } } } public static int getColorWithAlpha(int color, float ratio) { int newColor = 0; int alpha = Math.round(Color.alpha(color) * ratio); int r = Color.red(color); int g = Color.green(color); int b = Color.blue(color); newColor = Color.argb(alpha, r, g, b); return newColor; } public interface OnDrawListener { public void onReady(); }}
(5)样式style
<!-- 横向选择器样式 --> <declare-styleable name="StepsViewIndicator"> <attr name="numOfSteps" format="integer" /> </declare-styleable>
( 6 )点击下一步状态不断发生改变
public void changeStep(View view) { stepsView.setCompletedPosition(position).drawView(); if (position < labels.length) position++; if (position == labels.length) position = 0; }
这里写链接内容
1 0
- 进度选择器
- 第八章—进度对话框ProgressDialog、日期选择器DatePickerDialog、时间选择器TimePickerDialog
- 进度。。。。
- 进度
- 进度
- 进度
- 进度
- 进度
- 进度
- 进度
- 进度
- 进度
- 进度!进度!进度
- 选择器
- 选择器
- 选择器
- 选择器
- 选择器
- 从零开始——Windows环境lua编程
- iOS 读取通讯录
- MeasureSpec
- 关于java格式化数据,保留两位小数不精准的问题
- 如何快速启动 Android 模拟器
- 进度选择器
- Oracle连接数查看
- golang 并发 chan
- PHP_SELF、 SCRIPT_NAME、 REQUEST_URI区别
- Power of Three
- C++虚函数的底层实现原理
- Android 自定义View
- Contacts(CNContact)
- hdoj 5489 Removed Interval 【线段树维护LIS or LIS变形】