本文实例为大家分享了好看的android音量旋钮,供大家参考,具体内容如下
效果图:
实现思路,用的自定义的控件,图片和按钮都是自己绘制的,并且附带点击事件,可以监听当前的旋钮的值:
第一步:先把布局写了:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:andro android:orientation="vertical" android:background="#000000" android:layout_width="match_parent" android:gravity="center" android:layout_height="match_parent"> <TextView android: 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: 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; } }