android 音量旋转按钮,非常好看的android音量旋钮

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

效果图:

202024112211903.jpg

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

第一步:先把布局写了:

android:orientation="vertical"

android:background="#000000"

android:layout_width="match_parent"

android:gravity="center"

android:layout_height="match_parent">

android:

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:textColor="#ffffff"

/>

android:layout_width="300dp"

android:layout_height="300dp"

android:layout_marginBottom="10dp"

android:orientation="horizontal">

android:

android:layout_width="0dp"

android:layout_height="match_parent"

android:layout_weight="1"

android:background="#000000" />

第二步:然后把自定义的控件类写了: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;

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值