您好,登錄后才能下訂單哦!
這篇文章將為大家詳細講解有關如何實現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音量旋鈕”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,使各位可以學到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。