非常好看的android音量旋钮

 更新时间:2020年02月04日 11:23:22   作者:cf8833  
这篇文章主要为大家详细介绍了android好看的音量旋钮,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

本文实例为大家分享了好看的android音量旋钮,供大家参考,具体内容如下

效果图:

实现思路,用的自定义的控件,图片和按钮都是自己绘制的,并且附带点击事件,可以监听当前的旋钮的值:

第一步:先把布局写了:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 android:orientation="vertical"
 android:background="#000000"
 android:layout_width="match_parent"
 android:gravity="center"
 android:layout_height="match_parent">
 <TextView
  android:id="@+id/tv"
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:textColor="#ffffff"
  />
 <LinearLayout
  android:layout_width="300dp"
  android:layout_height="300dp"
  android:layout_marginBottom="10dp"
  android:orientation="horizontal">
 
  <com.example.longshine.zname.AnalogController
   android:id="@+id/controllerBass"
   android:layout_width="0dp"
   android:layout_height="match_parent"
   android:layout_weight="1"
   android:background="#000000" />
 
 </LinearLayout>
 
 
</LinearLayout>

第二步:然后把自定义的控件类写了:AnalogController

 import android.content.Context;
  import android.graphics.Canvas;
  import android.graphics.Color;
  import android.graphics.Paint;
  import android.util.AttributeSet;
  import android.view.MotionEvent;
  import android.view.View;
 
 
/**
 * Created by Harjot on 23-May-16.
 */
public class AnalogController extends View {
 
 static float width, height;
 float midx, midy;
 Paint textPaint;
 Paint circlePaint;
 public Paint circlePaint2;
 public Paint linePaint;
 String angle;
 float currdeg, deg = 3, downdeg, prevCurrDeg;
 boolean isIncreasing, isDecreasing;
 public static int themeColor = Color.parseColor("#B24242");
 
 int progressColor, lineColor;
 
 onProgressChangedListener mListener;
 
 String label;
 
 public interface onProgressChangedListener {
  void onProgressChanged(int progress);
 }
 
 public void setOnProgressChangedListener(onProgressChangedListener listener) {
  mListener = listener;
 }
 
 public AnalogController(Context context) {
  super(context);
  init();
 }
 
 public AnalogController(Context context, AttributeSet attrs) {
  super(context, attrs);
  init();
 }
 
 public AnalogController(Context context, AttributeSet attrs, int defStyleAttr) {
  super(context, attrs, defStyleAttr);
  init();
 }
 
 void init() {
  textPaint = new Paint();
  textPaint.setColor(Color.WHITE);
  textPaint.setStyle(Paint.Style.FILL);
  textPaint.setTextSize(20);
  textPaint.setFakeBoldText(true);
  textPaint.setTextAlign(Paint.Align.CENTER);
  circlePaint = new Paint();
  circlePaint.setColor(Color.parseColor("#222222"));
  circlePaint.setStyle(Paint.Style.FILL);
  circlePaint2 = new Paint();
  circlePaint2.setColor(themeColor);
//  circlePaint2.setColor(Color.parseColor("#FFA036"));
  circlePaint2.setStyle(Paint.Style.FILL);
  linePaint = new Paint();
  linePaint.setColor(themeColor);
//  linePaint.setColor(Color.parseColor("#FFA036"));
  linePaint.setStrokeWidth(7);
  angle = "0.0";
  label = "Label";
 }
 
 @Override
 protected void onDraw(Canvas canvas) {
  super.onDraw(canvas);
  midx = canvas.getWidth() / 2;
  midy = canvas.getHeight() / 2;
 
  int ang = 0;
  float x = 0, y = 0;
  int radius = (int) (Math.min(midx, midy) * ((float) 14.5 / 16));
  float deg2 = Math.max(3, deg);
  float deg3 = Math.min(deg, 21);
  for (int i = (int) (deg2); i < 22; i++) {
   float tmp = (float) i / 24;
   x = midx + (float) (radius * Math.sin(2 * Math.PI * (1.0 - tmp)));
   y = midy + (float) (radius * Math.cos(2 * Math.PI * (1.0 - tmp)));
   circlePaint.setColor(Color.parseColor("#111111"));
   canvas.drawCircle(x, y, ((float) radius / 15), circlePaint);
  }
  for (int i = 3; i <= deg3; i++) {
   float tmp = (float) i / 24;
   x = midx + (float) (radius * Math.sin(2 * Math.PI * (1.0 - tmp)));
   y = midy + (float) (radius * Math.cos(2 * Math.PI * (1.0 - tmp)));
   canvas.drawCircle(x, y, ((float) radius / 15), circlePaint2);
  }
 
  float tmp2 = (float) deg / 24;
  float x1 = midx + (float) (radius * ((float) 2 / 5) * Math.sin(2 * Math.PI * (1.0 - tmp2)));
  float y1 = midy + (float) (radius * ((float) 2 / 5) * Math.cos(2 * Math.PI * (1.0 - tmp2)));
  float x2 = midx + (float) (radius * ((float) 3 / 5) * Math.sin(2 * Math.PI * (1.0 - tmp2)));
  float y2 = midy + (float) (radius * ((float) 3 / 5) * Math.cos(2 * Math.PI * (1.0 - tmp2)));
 
  circlePaint.setColor(Color.parseColor("#222222"));
  canvas.drawCircle(midx, midy, radius * ((float) 13 / 15), circlePaint);
  circlePaint.setColor(Color.parseColor("#000000"));
  canvas.drawCircle(midx, midy, radius * ((float) 11 / 15), circlePaint);
  canvas.drawText(label, midx, midy + (float) (radius * 1.1), textPaint);
  canvas.drawLine(x1, y1, x2, y2, linePaint);
 
 }
 
 @Override
 public boolean onTouchEvent(MotionEvent e) {
 
  mListener.onProgressChanged((int) (deg - 2));
 
  if (e.getAction() == MotionEvent.ACTION_DOWN) {
   float dx = e.getX() - midx;
   float dy = e.getY() - midy;
   downdeg = (float) ((Math.atan2(dy, dx) * 180) / Math.PI);
   downdeg -= 90;
   if (downdeg < 0) {
    downdeg += 360;
   }
   downdeg = (float) Math.floor(downdeg / 15);
   return true;
  }
  if (e.getAction() == MotionEvent.ACTION_MOVE) {
   float dx = e.getX() - midx;
   float dy = e.getY() - midy;
   currdeg = (float) ((Math.atan2(dy, dx) * 180) / Math.PI);
   currdeg -= 90;
   if (currdeg < 0) {
    currdeg += 360;
   }
   currdeg = (float) Math.floor(currdeg / 15);
 
   if (currdeg == 0 && downdeg == 23) {
    deg++;
    if (deg > 21) {
     deg = 21;
    }
    downdeg = currdeg;
   } else if (currdeg == 23 && downdeg == 0) {
    deg--;
    if (deg < 3) {
     deg = 3;
    }
    downdeg = currdeg;
   } else {
    deg += (currdeg - downdeg);
    if (deg > 21) {
     deg = 21;
    }
    if (deg < 3) {
     deg = 3;
    }
    downdeg = currdeg;
   }
 
   angle = String.valueOf(String.valueOf(deg));
   invalidate();
   return true;
  }
  if (e.getAction() == MotionEvent.ACTION_UP) {
   return true;
  }
  return super.onTouchEvent(e);
 }
 
 public int getProgress() {
  return (int) (deg - 2);
 }
 
 public void setProgress(int x) {
  deg = x + 2;
 }
 
 public String getLabel() {
  return label;
 }
 
 public void setLabel(String txt) {
  label = txt;
 }
 
 public int getLineColor() {
  return lineColor;
 }
 
 public void setLineColor(int lineColor) {
  this.lineColor = lineColor;
 }
 
 public int getProgressColor() {
  return progressColor;
 }
 
 public void setProgressColor(int progressColor) {
  this.progressColor = progressColor;
 }
}

第三步:在MainActivity中,我们去写监听方法,查看旋钮的值:

import android.app.Activity;
import android.graphics.Color;
import android.os.Bundle;
import android.util.Log;
import android.widget.TextView;
 
 
/**
 * Created by 16857 on 2019/4/12.
 */
 
public class TextActivity extends Activity {
 AnalogController bassController;
 public static int themeColor = Color.parseColor("#B24242");
 private TextView tv;
 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.main);
 
  bassController = (AnalogController) findViewById(R.id.controllerBass);
  tv = (TextView)findViewById(R.id.tv);
 
  bassController.setLabel("BASS");
 
  bassController.circlePaint2.setColor(themeColor);
  bassController.linePaint.setColor(themeColor);
  bassController.invalidate();
  bassController.linePaint.setColor(themeColor);
 
  bassController.setOnProgressChangedListener(new AnalogController.onProgressChangedListener() {
   @Override
   public void onProgressChanged(int progress) {
    tv.setText(progress+"");
   }
  });
 
 }
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • Android Toast的几种使用方式及注意事项

    Android Toast的几种使用方式及注意事项

    Toast是Android中常用的组件,下面介绍下Toast使用的几种方式和注意事项,本文给大家分享Toast的使用方式,感兴趣的朋友一起看看吧
    2024-02-02
  • Android控制文本输入框最多输入10个字符长度

    Android控制文本输入框最多输入10个字符长度

    这篇文章主要为大家详细介绍了Android控制文本输入框最多输入10个字符长度,即最多输入5个汉字,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-10-10
  • RxJava 触发流基本原理源码解析

    RxJava 触发流基本原理源码解析

    这篇文章主要为大家介绍了RxJava 触发流基本原理源码解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-12-12
  • Android  调用系统应用的方法总结

    Android 调用系统应用的方法总结

    这篇文章主要介绍了Android 调用系统应用的方法总结的相关资料,这里提供调用录像,录音,拍照等功能,需要的朋友可以参考下
    2017-08-08
  • Android Tabhost使用方法详解

    Android Tabhost使用方法详解

    这篇文章主要为大家详细介绍了Android Tabhost使用方法,如何利用TabHost 实现tab视图,感兴趣的小伙伴们可以参考一下
    2016-06-06
  • Android实现网络多线程断点续传下载实例

    Android实现网络多线程断点续传下载实例

    本示例介绍在Android平台下通过HTTP协议实现断点续传下载。具有一定的参考价值,感兴趣的小伙伴们可以参考一下。
    2016-10-10
  • Android自定义View绘制贝塞尔曲线实现流程

    Android自定义View绘制贝塞尔曲线实现流程

    贝塞尔曲线的本质是通过数学计算的公式来绘制平滑的曲线,分为一阶,二阶,三阶及多阶。但是这里不讲数学公式和验证,那些伟大的数学家已经证明过了,所以就只讲讲Android开发中的运用吧
    2022-11-11
  • Android 自定义view仿支付宝咻一咻功能

    Android 自定义view仿支付宝咻一咻功能

    支付宝上有一个咻一咻的功能,就是点击图片后四周有水波纹的这种效果,今天就通过本文给大家分享实现此功能的思路及实例代码,一起看看吧
    2016-12-12
  • Android开发实现各种图形绘制功能示例

    Android开发实现各种图形绘制功能示例

    这篇文章主要介绍了Android开发实现各种图形绘制功能,结合实例形式分析了Android图形绘制常用的组件、函数使用方法及相关注意事项,需要的朋友可以参考下
    2017-09-09
  • 很详细的android序列化过程Parcelable

    很详细的android序列化过程Parcelable

    这篇文章主要为大家详细介绍了很详细的android序列化过程Parcelable,代码注释很详细,感兴趣的小伙伴们可以参考一下
    2016-08-08

最新评论