Seekbar:
The SeekBar is an interactive slider widget that allows the user to select one value from a range of values (from 0-max). As the user moves the slider left or right, the value of the SeekBar will change.
OR
A SeekBar is an extension of ProgressBar that adds a draggable thumb. The user can touch the thumb and drag left or right to set the current progress level or use the arrow keys. Placing focusable widgets to the left or right of a SeekBar is discouraged.
Seekbar is the best control for this kind of functions, where you will let user to select a value from your described range like I am going to use in this tutorial for volume and device screen brightness control.
Seekbar has a nested Interface called OnSeekBarChangeListener, It is a callback that notifies user when the progress level has been changed. This includes changes that were initiated by the user through a touch gesture or arrow key/trackball as well as changes that were initiated programmatically.
OnSeekBarChangeListener has three methods that can be used to get current progress value from seekbar at three states:
onProgressChanged: It notifies that progress level has changed, it is really helpful in this post.
onStartTrackingTouch: It notifies that the user has started touch gesture.
onStopTrackingTouch: It notifies that the user has finished touch gesture.
OutPut:
Create new Android Project
Project Name: Sound Brightness Settings
//tested from 2.3.3 to current android sdk
Build Target: Android 2.3.3 //or greater than that
Application Name: SeekBarDemo
Package Name: com.shaikhhamadali.blogspot.soundbrightnesssettings
Create Layout file: activity_main
1. code of Layout:
1. code of Layout:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context=".MainActivity" > <TextView android:id="@+id/tVBrightness" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerHorizontal="true" android:layout_marginTop="180dp" android:text="Brightness: " /> <TextView android:id="@+id/tVVolume" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerHorizontal="true" android:layout_marginTop="130dp" android:text="Volume: " /> <SeekBar android:id="@+id/sbVolume" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="150dp" /> <SeekBar android:id="@+id/sbBrightness" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_marginTop="200dp" > </SeekBar> </RelativeLayout>
2. code of activity:
package com.shaikhhamadali.blogspot.soundbrightnesssettings; import android.media.AudioManager; import android.os.Bundle; import android.provider.Settings.SettingNotFoundException; import android.app.Activity; import android.content.ContentResolver; import android.content.Context; import android.util.Log; import android.view.Menu; import android.view.Window; import android.view.WindowManager.LayoutParams; import android.widget.SeekBar; import android.widget.SeekBar.OnSeekBarChangeListener; import android.widget.TextView; import android.provider.Settings.System; public class MainActivity extends Activity { //TextViews to show details of volume and brightness private TextView tVBrightness,tVVolume; //SeekBars to set volume and brightness private SeekBar sbVolume,sbBrightness; //AudioManager object, that will get and set volume private AudioManager audioManager; //Variable to store brightness value private int brightness; //Content resolver used as a handle to the system's settings private ContentResolver cResolver; //Window object, that will store a reference to the current window private Window window; int maxVolume=1; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //Suggests an audio stream whose volume should be changed by the hardware volume controls. setVolumeControlStream(AudioManager.STREAM_MUSIC); initializeControls(); } private void initializeControls() { //get reference of the UI Controls sbVolume = (SeekBar) findViewById(R.id.sbVolume); sbBrightness = (SeekBar) findViewById(R.id.sbBrightness); tVVolume=(TextView)findViewById(R.id.tVVolume); tVBrightness = (TextView) findViewById(R.id.tVBrightness); try { audioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE); //set max progress according to volume sbVolume.setMax(audioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC)); //get current volume sbVolume.setProgress(audioManager.getStreamVolume(AudioManager.STREAM_MUSIC)); //Set the seek bar progress to 1 sbVolume.setKeyProgressIncrement(1); //get max volume maxVolume=sbVolume.getMax(); sbVolume.setOnSeekBarChangeListener(new OnSeekBarChangeListener() { @Override public void onStopTrackingTouch(SeekBar seekBar) {} @Override public void onStartTrackingTouch(SeekBar seekBar) {} @Override public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { audioManager.setStreamVolume(AudioManager.STREAM_MUSIC, progress, 0); //Calculate the brightness percentage float perc = (progress /(float)maxVolume)*100; //Set the brightness percentage tVVolume.setText("Volume: "+(int)perc +" %"); } }); } catch (Exception e) { } //Get the content resolver cResolver = getContentResolver(); //Get the current window window = getWindow(); //Set the seekbar range between 0 and 255 sbBrightness.setMax(255); //Set the seek bar progress to 1 sbBrightness.setKeyProgressIncrement(1); try { //Get the current system brightness brightness = System.getInt(cResolver, System.SCREEN_BRIGHTNESS); } catch (SettingNotFoundException e) { //Throw an error case it couldn't be retrieved Log.e("Error", "Cannot access system brightness"); e.printStackTrace(); } //Set the progress of the seek bar based on the system's brightness sbBrightness.setProgress(brightness); //Register OnSeekBarChangeListener, so it can actually change values sbBrightness.setOnSeekBarChangeListener(new OnSeekBarChangeListener() { public void onStopTrackingTouch(SeekBar seekBar) { //Set the system brightness using the brightness variable value System.putInt(cResolver, System.SCREEN_BRIGHTNESS, brightness); //Get the current window attributes LayoutParams layoutpars = window.getAttributes(); //Set the brightness of this window layoutpars.screenBrightness = brightness / (float)255; //Apply attribute changes to this window window.setAttributes(layoutpars); } public void onStartTrackingTouch(SeekBar seekBar) { //Nothing handled here } public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { //Set the minimal brightness level //if seek bar is 20 or any value below if(progress<=20) { //Set the brightness to 20 brightness=20; } else //brightness is greater than 20 { //Set brightness variable based on the progress bar brightness = progress; } //Calculate the brightness percentage float perc = (brightness /(float)255)*100; //Set the brightness percentage tVBrightness.setText("Brightness: "+(int)perc +" %"); } }); } }
Manifest:
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.shaikhhamadali.blogspot.soundbrightnesssettings" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="9" android:targetSdkVersion="19" /> <uses-permission android:name="android.permission.WRITE_SETTINGS"></uses-permission> <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name="com.shaikhhamadali.blogspot.soundbrightnesssettings.MainActivity" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest>
3. note that:
-
Good practice is to always get the current values of sound and brightness and their max values from settings to let seekbar work accordingly.
- Above I have used two methods onProgressChanged and onStopTrackingTouch, but you can use three of them according to your need project needs.
- Before running this, must add WRITE_SETTINGS permission in manifest.
- you may be interested in these post on playing with settings, ENABLE/DISABLE MOBILE DATA,BLUETOOTH,AIRPLANE MODE, Change Ringer mode etc.
Good practice is to always get the current values of sound and brightness and their max values from settings to let seekbar work accordingly.
4. conclusion:
- Some information about SeekBar and its usage.
- Some information about how to set volume using Seekbar.
- Some information about how to set Screen brightness using Seekbar.
- Know how to use seekbar control and how to get progress values of seekbar.
- Some information about SeekBar and its usage.
- Some information about how to set volume using Seekbar.
- Some information about how to set Screen brightness using Seekbar.
- Know how to use seekbar control and how to get progress values of seekbar.
5. About the post:
5. About the post:
- The code seems to explain itself due to comments, but if you have any questions you can freely ask too!
- Don’t mind to write a comment whatever you like to ask, to know,to suggest or recommend.
- Hope you enjoy it!
6. Source Code:
you can download the source code from: GoogleDrive, Github
Cheers,
Hamad Ali Shaikh
- The code seems to explain itself due to comments, but if you have any questions you can freely ask too!
- Don’t mind to write a comment whatever you like to ask, to know,to suggest or recommend.
- Hope you enjoy it!
6. Source Code:
you can download the source code from: GoogleDrive, Github
Cheers,
Hamad Ali Shaikh