개발/ANDROID 안드로이드 / / 2023. 7. 25. 14:13

Android Java Seekbar 화면 밝기 조절

반응형

Seekbar로 안드로이드 기기 화면 밝기 조절

 

AndroidManifest.xml

<!-- 설정 수정 권한 요청 -->
<uses-permission android:name="android.permission.WRITE_SETTINGS"
    tools:ignore="ProtectedPermissions" />

 

layout xml

<androidx.constraintlayout.widget.ConstraintLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".ui.SettingActivity">

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:padding="16dp">

            <!-- 기본 -->
<!--            <SeekBar-->
<!--                android:id="@+id/brightnessSeekBar"-->
<!--                android:layout_width="match_parent"-->
<!--                android:layout_height="wrap_content"-->
<!--                android:layout_centerInParent="true"-->
<!--                android:max="255"-->
<!--                android:progress="150" />-->

        <!-- 커스텀 -->
        <SeekBar
            android:id="@+id/brightnessSeekBar"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_centerInParent="true"
            android:max="255"
            android:progress="150"
            android:progressDrawable="@drawable/custom_seekbar_progress"
            android:thumb="@drawable/custom_seekbar_thumb" />

    </RelativeLayout>
</androidx.constraintlayout.widget.ConstraintLayout>

 

custom_seekbar_progress.xml (Seekbar의 선 부분에 해당)

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <!--시크바 배경-->
    <item android:id="@android:id/background">
        <shape android:shape="line">    <!--선 : 길이6dp -->
            <stroke android:width="6dp" android:color="#D5D5D5" />
        </shape>
    </item>

    <!-- 시크바 프로그래스 -->
    <item android:id="@android:id/progress" >
        <clip>
            <shape android:shape="line">
                <stroke android:width="6dp" android:color="#FFA800" />
            </shape>
        </clip>
    </item>
</layer-list>

 

custom_seekbar_thumb.xml (Seekbar의 원 부분에 해당)

<?xml version="1.0" encoding="utf-8"?>
<ripple xmlns:android="http://schemas.android.com/apk/res/android"
    android:color="@color/color_FF650F_danger">
    <item>
        <shape android:shape="oval">
            <solid android:color="@color/color_FF650F_danger"/>
            <size android:width="30dp" android:height="30dp"/>
        </shape>
    </item>
</ripple>

 

BrightnessControlUtils.java

public class BrightnessControlUtils {

    private SeekBar brightnessSeekBar;

    public BrightnessControlUtils(SeekBar brightnessSeekBar) {
        this.brightnessSeekBar = brightnessSeekBar;
    }

    /**
     * 화면 밝기를 설정합니다.
     *
     * @param activity        액티비티 객체
     * @param brightnessValue 설정할 화면 밝기 값 (0 ~ 255)
     */
    public void setBrightness(Activity activity, int brightnessValue) {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            // Android 6.0 이상은 Settings.System 사용
            if (Settings.System.canWrite(activity)) {
                Settings.System.putInt(activity.getContentResolver(), Settings.System.SCREEN_BRIGHTNESS, brightnessValue);
            }
        } else {
            // Android 6.0 미만은 WindowManager.LayoutParams 사용
            WindowManager.LayoutParams layoutParams = activity.getWindow().getAttributes();
            layoutParams.screenBrightness = (float) brightnessValue / 255.0f;
            activity.getWindow().setAttributes(layoutParams);
        }
    }

    /**
     * SeekBar의 상태를 업데이트합니다.
     *
     * @param activity 액티비티 객체
     */
    public void updateSeekBar(Activity activity) {
        int currentBrightnessValue = getCurrentBrightness(activity);
        brightnessSeekBar.setProgress(currentBrightnessValue);
    }

    private int getCurrentBrightness(Activity activity) {
        int currentBrightnessValue = 0;
        try {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                currentBrightnessValue = Settings.System.getInt(activity.getContentResolver(), Settings.System.SCREEN_BRIGHTNESS);
            } else {
                WindowManager.LayoutParams layoutParams = activity.getWindow().getAttributes();
                currentBrightnessValue = (int) (layoutParams.screenBrightness * 255.0f);
            }
        } catch (Settings.SettingNotFoundException e) {
            e.printStackTrace();
        }
        return currentBrightnessValue;
    }
}

 

activity.java

public class SettingActivity extends AppCompatActivity {
    ActivitySettingBinding binding;

    private BrightnessControlUtils brightnessControlUtils;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        binding = DataBindingUtil.setContentView(this, R.layout.activity_setting);

        // 권한이 없을 경우 설정 화면으로 이동하여 권한 요청
        if (!Settings.System.canWrite(SettingActivity.this)) {
            Intent intent = new Intent(Settings.ACTION_MANAGE_WRITE_SETTINGS);
            intent.setData(Uri.parse("package:" + getPackageName()));
            intent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
            startActivity(intent);
        }

        // 화면 밝기 조절 기능 초기화
        setBrightnessControl();
    }

    /**
     * 화면 밝기 조절 기능을 초기화합니다.
     */
    private void setBrightnessControl() {
        // BrightnessControlUtils 클래스를 사용하여 SeekBar를 초기화합니다.
        brightnessControlUtils = new BrightnessControlUtils(binding.brightnessSeekBar);

        // SeekBar 값이 변경될 때 화면 밝기를 설정합니다.
        binding.brightnessSeekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
            @Override
            public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
                // 사용자가 SeekBar 값을 변경할 때 화면 밝기를 설정합니다.
                brightnessControlUtils.setBrightness(SettingActivity.this, progress);
            }

            @Override
            public void onStartTrackingTouch(SeekBar seekBar) {
                // 사용자가 SeekBar를 터치하여 드래그를 시작할 때 호출됩니다.
            }

            @Override
            public void onStopTrackingTouch(SeekBar seekBar) {
                // 사용자가 SeekBar 터치를 끝내고 드래그를 멈출 때 호출됩니다.
            }
        });

        // 현재 화면 밝기 값을 SeekBar에 업데이트합니다.
        brightnessControlUtils.updateSeekBar(SettingActivity.this);
    }
}
반응형
  • 네이버 블로그 공유
  • 네이버 밴드 공유
  • 페이스북 공유
  • 카카오스토리 공유