自定义button,达到一个光点绕圈运动的效果
来源:互联网 发布:js data属性 编辑:程序博客网 时间:2024/05/23 22:44
自定义需要的方法并绑定上,用以控制自定义控件,
OnMearsure 方法 用以得到自定义控件的 宽高
去绘制控件
获取下个坐标 继续绘制
以上是主要的 方法 , 而在 Activity中 运用的:
以下附上 效果图 和 主要类 ,MyButton: 转载请注明原创----------
/** * Created by Administrator on 2016/5/25. */public class MyButton extends Button { //默认值 private static final int DEFAULT_BORDER_WIDTH = 1;//dp private static final int DEFAULT_BORDER_COLOR = 0xFF3A9BD9; private static final int DEFAULT_RADIUS = 8;//dp private static final int DEFAULT_center_width = 20;//dp private static final int DEFAULT_DOT_RADIUS = 2;//dp private static final int DEFAULT_DOT_COLOR = 0xff0000ff; private static final int DEFAULT_DOT_SPEED = 2;//dp private static final int DEFAULT_DOT_WIDTH = 1;//dp private static final int DEFAULT_DOT_background = 0xff303030; private static final int DEFAULT_TEXT_COLOR = 0xff000000; private static final int DEFAULT_TEXT_SIZE = 14;//sp //获取的值,不设置的话就等于默认值 private int mBorderWidth = dp2px(DEFAULT_BORDER_WIDTH);//边框的宽度 private int mBorderColor = DEFAULT_BORDER_COLOR;//边框的颜色 private int mRadius = dp2px(DEFAULT_RADIUS);//两端半圆形的半径 private int mCenterWidth = dp2px(DEFAULT_center_width);//中间矩形的长度(是宽,不是高) private int mDotRadius = dp2px(DEFAULT_DOT_RADIUS);//小点的半径 private int mDotColor = DEFAULT_DOT_COLOR;//小点的颜色 private int mDotSpeed = dp2px(DEFAULT_DOT_SPEED);//小点的速度 private int mDotWidth = dp2px(DEFAULT_DOT_WIDTH); private int mDotBackground = DEFAULT_DOT_background; private String mText; private int mTextColor = DEFAULT_TEXT_COLOR; private int mTextSize = sp2px(DEFAULT_TEXT_SIZE); //画笔 private Paint mPaint; //绘制左右两边半圆时要用到 private RectF mRectFLeft; private RectF mRectFRight; //是否开始移动小点 private boolean mStartRunning = false; //当前坐标xy private int mCurrentX; private int mCurrentY; //移动的角速度,根据速度求出来 private float mSpeedAngle; //当前的角度 private float currentAngle; private float mTextWidth; private float mTextHeight; public MyButton(Context context) { this(context, null); } public MyButton(Context context, AttributeSet attrs) { super(context, attrs); initAttrs(attrs); mPaint = new Paint(); //必须设置字体大小,不然下面获取不到字体的宽高 mPaint.setTextSize(mTextSize); mTextWidth = mPaint.measureText(mText); mTextHeight = mPaint.descent() + mPaint.ascent(); mCurrentX = mRadius; mCurrentY = 0; mSpeedAngle = 180 * mDotSpeed / (mRadius * 3.14f); mRectFLeft = new RectF(0, 0, mRadius * 2, mRadius * 2); mRectFRight = new RectF(mCenterWidth, 0, mCenterWidth + mRadius * 2, mRadius * 2); } private void initAttrs(AttributeSet attrs) { TypedArray typedArray = getContext().obtainStyledAttributes(attrs, R.styleable.MyButton); mBorderWidth = (int) typedArray.getDimension(R.styleable.MyButton_but_width, mBorderWidth); mBorderColor = typedArray.getColor(R.styleable.MyButton_but_color, mBorderColor); mRadius = (int) typedArray.getDimension(R.styleable.MyButton_radius, mRadius); mCenterWidth = (int) typedArray.getDimension(R.styleable.MyButton_center_width, mCenterWidth); mDotRadius = (int) typedArray.getDimension(R.styleable.MyButton_dot_radius, mDotRadius); mDotColor = typedArray.getColor(R.styleable.MyButton_dot_color, mDotColor); mDotSpeed = (int) typedArray.getDimension(R.styleable.MyButton_dot_speed, mDotSpeed); mDotWidth = (int) typedArray.getDimension(R.styleable.MyButton_dot_width, mDotWidth); mDotBackground = typedArray.getColor(R.styleable.MyButton_dot_background, mDotBackground); mText = typedArray.getString(R.styleable.MyButton_text); mTextColor = typedArray.getColor(R.styleable.MyButton_text_color, mTextColor); mTextSize = (int) typedArray.getDimension(R.styleable.MyButton_text_size, mTextSize); typedArray.recycle(); } public void setmText(String text){ mText = text; invalidate(); } public void startRunning() { mStartRunning = true; invalidate(); } public void stopRunning() { mStartRunning = false; } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { int width = measureWidth(widthMeasureSpec); int height = measureHeight(heightMeasureSpec); setMeasuredDimension(width, height); } //测量所需的宽度 private int measureWidth(int widthMeasureSpec) { int except = mRadius * 2 + mCenterWidth + mBorderWidth + getPaddingLeft() + getPaddingRight(); return resolveSize(except, widthMeasureSpec); } //测量所需的高度 private int measureHeight(int heightMeasureSpec) { int except = mRadius * 2 + mBorderWidth + getPaddingTop() + getPaddingBottom(); return resolveSize(except, heightMeasureSpec); } @Override protected void onDraw(Canvas canvas) { canvas.save(); canvas.translate(getPaddingLeft() + mBorderWidth / 2, getPaddingTop() + mBorderWidth / 2); mPaint.setStyle(Paint.Style.STROKE); mPaint.setAntiAlias(true); mPaint.setDither(true); mPaint.setColor(mBorderColor); mPaint.setStrokeWidth(mBorderWidth); //画椭圆背景 canvas.drawArc(mRectFLeft, 90f, 180f, false, mPaint); canvas.drawArc(mRectFRight, -90f, 180f, false, mPaint); canvas.drawLine(mRadius, 0, mRadius + mCenterWidth, 0, mPaint); canvas.drawLine(mRadius, mRadius * 2, mRadius + mCenterWidth, mRadius * 2, mPaint); //画字 mPaint.setTextSize(mTextSize); mPaint.setColor(mTextColor); mPaint.setStyle(Paint.Style.FILL); canvas.drawText(mText, mRadius + mCenterWidth / 2 - mTextWidth / 2, mRadius - mTextHeight / 2, mPaint); //画小圆点,判断是否处于运动状态 if (mStartRunning) { getNextPoint(); mPaint.setStyle(Paint.Style.FILL); mPaint.setColor(mDotBackground); canvas.drawCircle(mCurrentX, mCurrentY, mDotRadius, mPaint); mPaint.setStrokeWidth(mDotWidth); mPaint.setColor(mDotColor); mPaint.setStyle(Paint.Style.STROKE); canvas.drawCircle(mCurrentX, mCurrentY, mDotRadius, mPaint); } canvas.restore(); //判断是否需要重新绘制 if (mStartRunning) { invalidate(); } } //获取下一个坐标 private void getNextPoint() { if (mCurrentY == 0 && mRadius <= mCurrentX && mCurrentX < mRadius + mCenterWidth) { mCurrentX = Math.min(mCurrentX + mDotSpeed, mRadius + mCenterWidth); } else if (mCurrentY >= 0 && mCurrentY < mRadius * 2 && mCurrentX >= mRadius + mCenterWidth) { if (!(currentAngle > 180)) { mCurrentY = (int) (mRadius - mRadius * Math.sin(Math.toRadians(90 - currentAngle))); float f = 90 - currentAngle; float v = (float) (mRadius * Math.cos(Math.toRadians(f))); mCurrentX = (int) (mRadius + mCenterWidth + v); currentAngle += mSpeedAngle; currentAngle = Math.min(currentAngle, 180); } else { mCurrentX = mRadius + mCenterWidth; mCurrentY = mRadius * 2; currentAngle = 180; } } else if (mCurrentX <= mRadius + mCenterWidth && mCurrentX > mRadius && mCurrentY == mRadius * 2) { mCurrentX = Math.max(mCurrentX - mDotSpeed, mRadius); } else if (mCurrentY <= mRadius * 2 && mCurrentY >= 0 && mCurrentX <= mRadius) { if ((currentAngle < 360)) { mCurrentX = (int) (mRadius + mRadius * Math.cos(Math.toRadians(90 - currentAngle))); mCurrentY = (int) (mRadius - mRadius * Math.sin(Math.toRadians(90 - currentAngle))); currentAngle += mSpeedAngle; currentAngle = Math.min(currentAngle, 360); } else { mCurrentX = mRadius; mCurrentY = 0; currentAngle = 0; } } else { return; } } protected int dp2px(int dpVal) { return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dpVal, getResources().getDisplayMetrics()); } protected int sp2px(int spVal) { return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, spVal, getResources().getDisplayMetrics()); }}
以后 还会发 关于 自定义控件的 博客 ,多多关注 。。 大家一起交流学习。
0 0
- 自定义button,达到一个光点绕圈运动的效果
- 用一个listview达到ScrollView的效果
- 自定义一个圆形运动步数de计步效果
- Android 自定义 EditText 达到从右边输入的效果
- Android自定义Button的点击效果
- Android自定义Button的点击效果
- ionic 自定义button的dropdowns效果
- 如何利用一个变量来达到多重循环的效果?
- 自定义Button点击效果
- Button自定义点击效果
- 自定义一个图片加文字button,点击有效果
- 饮酒可代替运动达到健身效果?(图)
- android自定义一个带进度条的button
- 【Android】如何设置一个自定义的Button
- Android自定义TextView 达到倾斜效果
- 在tableview的section的头尾里添加控件的方法,如button达到qq分组的效果
- Android自定义Button点击效果
- android自定义button点击效果
- Android TextView通过Spannable识别超链接、邮箱、电话
- Android 添加系统串口服务步骤
- Linux 后台启动
- 布局延伸到状态栏
- MATLAB数学建模练习(1)-线性规划
- 自定义button,达到一个光点绕圈运动的效果
- 1033. To Fill or Not to Fill (25)
- 反爬虫
- Android RoundedBitmapDrawable:Android官方的圆角图形图象实现方案
- MTK Android 6.0 上新增KeyCode
- javascript 引用类型 - Object类型
- maven pom.xml 标签大全
- 14. Longest Common Prefix
- 复选列表只能选中一条记录