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 |
댓글