Android自定义控制条效果

作者:rains at night 时间:2023-01-23 23:59:12 

本文实例为大家分享了Android自定义控制条效果的具体代码,供大家参考,具体内容如下

ControlBar

自定义一个可以调节大小的控件,可以根据宽高来指定控制条方向。当width >= heigth时,为横向控制条,否则为竖向控制条

onMeasure

根据用户给定的width与height计算控制条的坐标。

1.主要的计算思路

Android自定义控制条效果

先计算横向的的坐标点,竖向的坐标点即横向的逆时针旋转90度再向下移一个heigth的长度。


//横向坐标点
mHorLArcFirstPathX = mRadius + mLArcLength;
mHorLArcFirstPathY = startY + mBarHeight * (1.0f - LITTLE_ARC_PER_WIDTH) / 2.0f ;
//对应竖向坐标点
mLArcFirstPathX = mHorLArcFirstPathY;
mLArcFirstPathY = -mHorLArcFirstPathX + longSide;

onDraw

根据计算所得坐标点,构建路径,绘图


super.onDraw(canvas);
 mBgPaint.setColor(Color.WHITE);
 canvas.drawPath(mBgPath, mBgPaint);
 mBgPaint.setColor(Color.GRAY);
 canvas.drawPath(mMaxPath, mBgPaint);
 canvas.drawPath(mPath, mPaint);
 mBgPaint.setColor(Color.WHITE);
 if(mDirection == HORIZONTAL){
  canvas.drawCircle(mRadius + mPercent * mBarWidth, mRadius, mRadius, mBgPaint);
  canvas.drawCircle(mRadius + mPercent * mBarWidth, mRadius, mRadius - SPACING, mPaint);
 }else {
  canvas.drawCircle(mRadius, mHeight - (mRadius + mPercent * mBarWidth), mRadius, mBgPaint);
  canvas.drawCircle(mRadius, mHeight - (mRadius + mPercent * mBarWidth), mRadius - SPACING, mPaint);
 }

onTouchEvent

根据手指滑动,动态调整数值大小


@Override
public boolean onTouchEvent(MotionEvent event) {
 switch (event.getAction()){
  case MotionEvent.ACTION_DOWN:
  case MotionEvent.ACTION_MOVE:
   float distance = 0;
   float maxDist = 0;
   switch (mDirection){
    case HORIZONTAL:
     distance = event.getX();
     maxDist = mWidth;
     break;
    case VERTICAL:
     distance = mHeight - event.getY();
     maxDist = mHeight;
     break;
   }
   if(distance <= mRadius){
    updateView(MIN_VALUE);
   }else if(distance >= maxDist - mRadius){
    updateView(MAX_VALUE);
   }else {
    updateView(calculatingValue(distance));
   }
   return true;
  default:
   return super.onTouchEvent(event);
 }
}

实际效果如图所示

横向控制条

Android自定义控制条效果

竖向控制条

Android自定义控制条效果

项目github地址

来源:https://blog.csdn.net/m0_38085948/article/details/107062094

标签:Android,控制条
0
投稿

猜你喜欢

  • C#浅拷贝和深拷贝实例解析

    2022-09-03 02:31:05
  • Android Vitamio和ExoPlayer两种播放器优劣分析

    2023-02-25 13:21:51
  • Java使用OCR技术识别验证码实现自动化登陆方法

    2022-03-10 04:34:52
  • java实现解析二进制文件的方法(字符串、图片)

    2023-04-18 19:07:51
  • javaSE基础如何通俗的理解javaBean是什么

    2023-09-20 00:34:13
  • Android中卡顿优化布局详细介绍

    2022-10-28 10:53:00
  • 初步了解javafx

    2021-09-30 16:20:11
  • 自定义log4j日志文件命名规则说明

    2021-11-21 16:55:51
  • Android实现图片拖动效果

    2022-12-05 09:46:27
  • Java Condition条件变量提高线程通信效率

    2022-11-26 13:32:46
  • Android应用程序(APK)的编译打包过程

    2021-10-29 14:37:07
  • JAVA中数组从小到大排序的2种方法实例

    2021-10-09 09:46:18
  • Java利用MessageFormat实现短信模板的匹配

    2023-02-19 11:41:54
  • java组件commons-fileupload实现文件上传

    2022-10-02 08:33:14
  • SpringBoot 使用Prometheus采集自定义指标数据的方案

    2023-04-25 02:50:39
  • java利用Socket实现聊天室功能实例

    2022-11-10 01:25:43
  • SpringBoot结合Redis配置工具类实现动态切换库

    2022-04-15 14:14:13
  • Java的Struts框架中<results>标签的使用方法

    2022-04-16 16:08:22
  • SpringBoot Test类注入失败的解决

    2023-05-20 13:59:40
  • Spring JPA联表查询之注解属性详解

    2021-11-04 14:19:04
  • asp之家 软件编程 m.aspxhome.com