본문 바로가기
App/Android Java

Android_Java(6) - VolumeControlView

by SeleniumBindingProtein 2022. 2. 7.
728x90
반응형

<MainActivity.java>

package kr.co.volumecontrolview;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.widget.RatingBar;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        getSupportActionBar().setDisplayShowHomeEnabled(true);
        getSupportActionBar().setIcon(R.drawable.ic_launcher);

        final RatingBar ratingBar = findViewById(R.id.ratingBar);
        VolumeControlView view = findViewById(R.id.volume);

        view.setKnobListener(new VolumeControlView.KnobListener() {
            @Override
            public void onChanged(double angle) {
              float rating = ratingBar.getRating();
              if (angle > 0.0 && rating < 7.0)
                  //오른쪽 회전
                  ratingBar.setRating(rating+1.0f);
              else if (rating > 0.0)
                  //왼쪽 회전
                  ratingBar.setRating(rating-1.0f);
            }
        });
    }
}

<VolumeControlView.java>

package kr.co.volumecontrolview;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.AppCompatImageView;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.os.Bundle;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;

public class VolumeControlView extends AppCompatImageView implements View.OnTouchListener{

    private  double angle = 0.0;
    private KnobListener listener;
    float x,y;
    float mx, my;


    public VolumeControlView(@NonNull Context context) {
        super(context);
        this.setImageResource(R.drawable.knob);
        this.setOnTouchListener(this);
    }

    public VolumeControlView(@NonNull Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
        this.setImageResource(R.drawable.knob);
        this.setOnTouchListener(this);
    }

    @Override
    public boolean onTouch(View view, MotionEvent motionEvent) {
        x = motionEvent.getX(0);
        y = motionEvent.getY(0);
        angle = getAngle(x,y);
        invalidate();
        listener.onChanged(angle);

        return true;
    }

    @Override
    protected  void onDraw(Canvas canvas){
        Paint paint = new Paint();
        canvas.rotate((float) angle, getWidth()/2, getHeight()/2);

        super.onDraw(canvas);
    }

    //두 점의 각도 구하기
    private double getAngle(float x, float y){
        mx = x - (getWidth()/2.0f);
        my = (getHeight()/2.0f) - y;
        double degree = Math.atan2(mx,my) * 180.0 / 3.141592;   //각도로 변환하는 공식
        return degree;
    }

    interface KnobListener {
        public void onChanged(double angle);
    }

    public void setKnobListener(KnobListener listener) {
        this.listener = listener;
    }
}

<activity_main.xml>

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".MainActivity">

    <kr.co.volumecontrolview.VolumeControlView
        android:layout_width="300px"
        android:layout_height="300px"
        android:id="@+id/volume"
        android:layout_gravity="center"/>

    <RatingBar
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/ratingBar"
        android:layout_below="@+id/volume"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true"
        android:layout_marginLeft="13dp"
        android:layout_marginStart="13dp"
        android:layout_marginTop="36dp"/>

</LinearLayout>

<결과 출력>

728x90
반응형

'App > Android Java' 카테고리의 다른 글

Android_Java(8) - CalcuWithTableLayout  (0) 2022.02.07
Android_Java(7) - RadioBtn  (0) 2022.02.07
Android_Java(5) - MyViewEvent  (0) 2022.02.07
Android_Java(4) - RatingBarApp  (0) 2022.02.07
Android_Java(3) - ImageView(pets)  (0) 2022.02.04

댓글