forked from dolphin-emu/dolphin
Added Opacity settings for touchscreen controls
Added Opacity controls for the user to customize the opacity of their touchscreen controls. Also, placed both Scale and Opacity settings into one window/option called Adjust Controls.
This commit is contained in:
committed by
sspacelynx
parent
7fdd4afd9c
commit
d1c3d4f419
@@ -544,7 +544,7 @@ public final class EmulationActivity extends AppCompatActivity
|
|||||||
toggleControls();
|
toggleControls();
|
||||||
break;
|
break;
|
||||||
|
|
||||||
// Adjust the scale of the overlay controls.
|
// Adjust the scale and opacity of the overlay controls.
|
||||||
case MENU_ACTION_ADJUST_SCALE:
|
case MENU_ACTION_ADJUST_SCALE:
|
||||||
adjustScale();
|
adjustScale();
|
||||||
break;
|
break;
|
||||||
@@ -828,15 +828,14 @@ public final class EmulationActivity extends AppCompatActivity
|
|||||||
private void adjustScale()
|
private void adjustScale()
|
||||||
{
|
{
|
||||||
LayoutInflater inflater = LayoutInflater.from(this);
|
LayoutInflater inflater = LayoutInflater.from(this);
|
||||||
View view = inflater.inflate(R.layout.dialog_seekbar, null);
|
View view = inflater.inflate(R.layout.dialog_input_adjust, null);
|
||||||
|
|
||||||
final SeekBar seekbar = view.findViewById(R.id.seekbar);
|
final SeekBar scaleSeekbar = view.findViewById(R.id.input_scale_seekbar);
|
||||||
final TextView value = view.findViewById(R.id.text_value);
|
final TextView scaleValue = view.findViewById(R.id.input_scale_value);
|
||||||
final TextView units = view.findViewById(R.id.text_units);
|
|
||||||
|
|
||||||
seekbar.setMax(150);
|
scaleSeekbar.setMax(150);
|
||||||
seekbar.setProgress(IntSetting.MAIN_CONTROL_SCALE.getInt(mSettings));
|
scaleSeekbar.setProgress(IntSetting.MAIN_CONTROL_SCALE.getInt(mSettings));
|
||||||
seekbar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener()
|
scaleSeekbar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener()
|
||||||
{
|
{
|
||||||
public void onStartTrackingTouch(SeekBar seekBar)
|
public void onStartTrackingTouch(SeekBar seekBar)
|
||||||
{
|
{
|
||||||
@@ -845,7 +844,7 @@ public final class EmulationActivity extends AppCompatActivity
|
|||||||
|
|
||||||
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser)
|
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser)
|
||||||
{
|
{
|
||||||
value.setText(String.valueOf(progress + 50));
|
scaleValue.setText((progress + 50) + "%");
|
||||||
}
|
}
|
||||||
|
|
||||||
public void onStopTrackingTouch(SeekBar seekBar)
|
public void onStopTrackingTouch(SeekBar seekBar)
|
||||||
@@ -854,20 +853,46 @@ public final class EmulationActivity extends AppCompatActivity
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
value.setText(String.valueOf(seekbar.getProgress() + 50));
|
scaleValue.setText((scaleSeekbar.getProgress() + 50) + "%");
|
||||||
units.setText("%");
|
|
||||||
|
// alpha
|
||||||
|
final SeekBar seekbarOpacity = view.findViewById(R.id.input_opacity_seekbar);
|
||||||
|
final TextView valueOpacity = view.findViewById(R.id.input_opacity_value);
|
||||||
|
|
||||||
|
seekbarOpacity.setMax(100);
|
||||||
|
seekbarOpacity.setProgress(IntSetting.MAIN_CONTROL_OPACITY.getInt(mSettings));
|
||||||
|
seekbarOpacity.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener()
|
||||||
|
{
|
||||||
|
public void onStartTrackingTouch(SeekBar seekBar)
|
||||||
|
{
|
||||||
|
// Do nothing
|
||||||
|
}
|
||||||
|
|
||||||
|
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser)
|
||||||
|
{
|
||||||
|
valueOpacity.setText(progress + "%");
|
||||||
|
}
|
||||||
|
|
||||||
|
public void onStopTrackingTouch(SeekBar seekBar)
|
||||||
|
{
|
||||||
|
// Do nothing
|
||||||
|
}
|
||||||
|
});
|
||||||
|
valueOpacity.setText(seekbarOpacity.getProgress() + "%");
|
||||||
|
|
||||||
AlertDialog.Builder builder = new AlertDialog.Builder(this, R.style.DolphinDialogBase);
|
AlertDialog.Builder builder = new AlertDialog.Builder(this, R.style.DolphinDialogBase);
|
||||||
builder.setTitle(R.string.emulation_control_scale);
|
builder.setTitle(R.string.emulation_control_adjustments);
|
||||||
builder.setView(view);
|
builder.setView(view);
|
||||||
builder.setPositiveButton(R.string.ok, (dialogInterface, i) ->
|
builder.setPositiveButton(R.string.ok, (dialogInterface, i) ->
|
||||||
{
|
{
|
||||||
IntSetting.MAIN_CONTROL_SCALE.setInt(mSettings, seekbar.getProgress());
|
IntSetting.MAIN_CONTROL_SCALE.setInt(mSettings, scaleSeekbar.getProgress());
|
||||||
|
IntSetting.MAIN_CONTROL_OPACITY.setInt(mSettings, seekbarOpacity.getProgress());
|
||||||
mEmulationFragment.refreshInputOverlay();
|
mEmulationFragment.refreshInputOverlay();
|
||||||
});
|
});
|
||||||
builder.setNeutralButton(R.string.default_values, (dialogInterface, i) ->
|
builder.setNeutralButton(R.string.default_values, (dialogInterface, i) ->
|
||||||
{
|
{
|
||||||
IntSetting.MAIN_CONTROL_SCALE.delete(mSettings);
|
IntSetting.MAIN_CONTROL_SCALE.delete(mSettings);
|
||||||
|
IntSetting.MAIN_CONTROL_OPACITY.delete(mSettings);
|
||||||
mEmulationFragment.refreshInputOverlay();
|
mEmulationFragment.refreshInputOverlay();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@@ -22,6 +22,7 @@ public enum IntSetting implements AbstractIntSetting
|
|||||||
MAIN_AUDIO_VOLUME(Settings.FILE_DOLPHIN, Settings.SECTION_INI_DSP, "Volume", 100),
|
MAIN_AUDIO_VOLUME(Settings.FILE_DOLPHIN, Settings.SECTION_INI_DSP, "Volume", 100),
|
||||||
|
|
||||||
MAIN_CONTROL_SCALE(Settings.FILE_DOLPHIN, Settings.SECTION_INI_ANDROID, "ControlScale", 50),
|
MAIN_CONTROL_SCALE(Settings.FILE_DOLPHIN, Settings.SECTION_INI_ANDROID, "ControlScale", 50),
|
||||||
|
MAIN_CONTROL_OPACITY(Settings.FILE_DOLPHIN, Settings.SECTION_INI_ANDROID, "ControlOpacity", 50),
|
||||||
MAIN_EMULATION_ORIENTATION(Settings.FILE_DOLPHIN, Settings.SECTION_INI_ANDROID,
|
MAIN_EMULATION_ORIENTATION(Settings.FILE_DOLPHIN, Settings.SECTION_INI_ANDROID,
|
||||||
"EmulationOrientation", ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE),
|
"EmulationOrientation", ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE),
|
||||||
MAIN_LAST_PLATFORM_TAB(Settings.FILE_DOLPHIN, Settings.SECTION_INI_ANDROID, "LastPlatformTab", 0),
|
MAIN_LAST_PLATFORM_TAB(Settings.FILE_DOLPHIN, Settings.SECTION_INI_ANDROID, "LastPlatformTab", 0),
|
||||||
|
@@ -955,6 +955,7 @@ public final class InputOverlay extends SurfaceView implements OnTouchListener
|
|||||||
|
|
||||||
// Need to set the image's position
|
// Need to set the image's position
|
||||||
overlayDrawable.setPosition(drawableX, drawableY);
|
overlayDrawable.setPosition(drawableX, drawableY);
|
||||||
|
overlayDrawable.setOpacity(IntSetting.MAIN_CONTROL_OPACITY.getIntGlobal() * 255 / 100);
|
||||||
|
|
||||||
return overlayDrawable;
|
return overlayDrawable;
|
||||||
}
|
}
|
||||||
@@ -1039,6 +1040,7 @@ public final class InputOverlay extends SurfaceView implements OnTouchListener
|
|||||||
|
|
||||||
// Need to set the image's position
|
// Need to set the image's position
|
||||||
overlayDrawable.setPosition(drawableX, drawableY);
|
overlayDrawable.setPosition(drawableX, drawableY);
|
||||||
|
overlayDrawable.setOpacity(IntSetting.MAIN_CONTROL_OPACITY.getIntGlobal() * 255 / 100);
|
||||||
|
|
||||||
return overlayDrawable;
|
return overlayDrawable;
|
||||||
}
|
}
|
||||||
@@ -1104,6 +1106,7 @@ public final class InputOverlay extends SurfaceView implements OnTouchListener
|
|||||||
|
|
||||||
// Need to set the image's position
|
// Need to set the image's position
|
||||||
overlayDrawable.setPosition(drawableX, drawableY);
|
overlayDrawable.setPosition(drawableX, drawableY);
|
||||||
|
overlayDrawable.setOpacity(IntSetting.MAIN_CONTROL_OPACITY.getIntGlobal() * 255 / 100);
|
||||||
|
|
||||||
return overlayDrawable;
|
return overlayDrawable;
|
||||||
}
|
}
|
||||||
|
@@ -114,6 +114,11 @@ public final class InputOverlayDrawableButton
|
|||||||
mPressedStateBitmap.setBounds(left, top, right, bottom);
|
mPressedStateBitmap.setBounds(left, top, right, bottom);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void setOpacity(int value)
|
||||||
|
{
|
||||||
|
mDefaultStateBitmap.setAlpha(value);
|
||||||
|
}
|
||||||
|
|
||||||
public Rect getBounds()
|
public Rect getBounds()
|
||||||
{
|
{
|
||||||
return mDefaultStateBitmap.getBounds();
|
return mDefaultStateBitmap.getBounds();
|
||||||
|
@@ -183,6 +183,11 @@ public final class InputOverlayDrawableDpad
|
|||||||
mPressedTwoDirectionsStateBitmap.setBounds(left, top, right, bottom);
|
mPressedTwoDirectionsStateBitmap.setBounds(left, top, right, bottom);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void setOpacity(int value)
|
||||||
|
{
|
||||||
|
mDefaultStateBitmap.setAlpha(value);
|
||||||
|
}
|
||||||
|
|
||||||
public Rect getBounds()
|
public Rect getBounds()
|
||||||
{
|
{
|
||||||
return mDefaultStateBitmap.getBounds();
|
return mDefaultStateBitmap.getBounds();
|
||||||
|
@@ -32,6 +32,7 @@ public final class InputOverlayDrawableJoystick
|
|||||||
private final int mHeight;
|
private final int mHeight;
|
||||||
private Rect mVirtBounds;
|
private Rect mVirtBounds;
|
||||||
private Rect mOrigBounds;
|
private Rect mOrigBounds;
|
||||||
|
private int mOpacity;
|
||||||
private final BitmapDrawable mOuterBitmap;
|
private final BitmapDrawable mOuterBitmap;
|
||||||
private final BitmapDrawable mDefaultStateInnerBitmap;
|
private final BitmapDrawable mDefaultStateInnerBitmap;
|
||||||
private final BitmapDrawable mPressedStateInnerBitmap;
|
private final BitmapDrawable mPressedStateInnerBitmap;
|
||||||
@@ -106,7 +107,7 @@ public final class InputOverlayDrawableJoystick
|
|||||||
{
|
{
|
||||||
mPressedState = pressed = true;
|
mPressedState = pressed = true;
|
||||||
mOuterBitmap.setAlpha(0);
|
mOuterBitmap.setAlpha(0);
|
||||||
mBoundsBoxBitmap.setAlpha(255);
|
mBoundsBoxBitmap.setAlpha(mOpacity);
|
||||||
if (reCenter)
|
if (reCenter)
|
||||||
{
|
{
|
||||||
getVirtBounds().offset((int) event.getX(pointerIndex) - getVirtBounds().centerX(),
|
getVirtBounds().offset((int) event.getX(pointerIndex) - getVirtBounds().centerX(),
|
||||||
@@ -123,7 +124,7 @@ public final class InputOverlayDrawableJoystick
|
|||||||
pressed = true;
|
pressed = true;
|
||||||
mPressedState = false;
|
mPressedState = false;
|
||||||
axises[0] = axises[1] = 0.0f;
|
axises[0] = axises[1] = 0.0f;
|
||||||
mOuterBitmap.setAlpha(255);
|
mOuterBitmap.setAlpha(mOpacity);
|
||||||
mBoundsBoxBitmap.setAlpha(0);
|
mBoundsBoxBitmap.setAlpha(0);
|
||||||
setVirtBounds(new Rect(mOrigBounds.left, mOrigBounds.top, mOrigBounds.right,
|
setVirtBounds(new Rect(mOrigBounds.left, mOrigBounds.top, mOrigBounds.right,
|
||||||
mOrigBounds.bottom));
|
mOrigBounds.bottom));
|
||||||
@@ -251,6 +252,13 @@ public final class InputOverlayDrawableJoystick
|
|||||||
mOuterBitmap.setBounds(bounds);
|
mOuterBitmap.setBounds(bounds);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void setOpacity(int value)
|
||||||
|
{
|
||||||
|
mOpacity = value;
|
||||||
|
mDefaultStateInnerBitmap.setAlpha(value);
|
||||||
|
mOuterBitmap.setAlpha(value);
|
||||||
|
}
|
||||||
|
|
||||||
public Rect getBounds()
|
public Rect getBounds()
|
||||||
{
|
{
|
||||||
return mOuterBitmap.getBounds();
|
return mOuterBitmap.getBounds();
|
||||||
|
102
Source/Android/app/src/main/res/layout/dialog_input_adjust.xml
Normal file
102
Source/Android/app/src/main/res/layout/dialog_input_adjust.xml
Normal file
@@ -0,0 +1,102 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
xmlns:tools="http://schemas.android.com/tools"
|
||||||
|
android:orientation="vertical"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content">
|
||||||
|
|
||||||
|
<RelativeLayout
|
||||||
|
android:id="@+id/input_scale"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_alignParentStart="true"
|
||||||
|
android:layout_alignParentTop="true"
|
||||||
|
android:clickable="false">
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/input_scale_name"
|
||||||
|
style="@style/TextAppearance.AppCompat.Headline"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_alignParentStart="true"
|
||||||
|
android:layout_alignParentTop="true"
|
||||||
|
android:layout_marginStart="@dimen/spacing_large"
|
||||||
|
android:layout_marginTop="@dimen/spacing_large"
|
||||||
|
android:layout_marginEnd="@dimen/spacing_large"
|
||||||
|
android:text="@string/emulation_control_scale"
|
||||||
|
android:textSize="16sp"
|
||||||
|
tools:text="@string/overclock_enable" />
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/input_scale_value"
|
||||||
|
android:layout_width="40dp"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_below="@+id/input_scale_name"
|
||||||
|
android:layout_alignParentEnd="true"
|
||||||
|
android:layout_marginStart="@dimen/spacing_small"
|
||||||
|
android:layout_marginTop="@dimen/spacing_medlarge"
|
||||||
|
android:layout_marginEnd="@dimen/spacing_large"
|
||||||
|
android:layout_marginBottom="@dimen/spacing_large"
|
||||||
|
tools:text="99%"
|
||||||
|
android:textAlignment="textEnd"/>
|
||||||
|
|
||||||
|
<SeekBar
|
||||||
|
android:id="@+id/input_scale_seekbar"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_below="@+id/input_scale_name"
|
||||||
|
android:layout_alignParentStart="true"
|
||||||
|
android:layout_marginTop="@dimen/spacing_medlarge"
|
||||||
|
android:layout_marginBottom="@dimen/spacing_large"
|
||||||
|
android:layout_toStartOf="@id/input_scale_value" />
|
||||||
|
|
||||||
|
</RelativeLayout>
|
||||||
|
|
||||||
|
<RelativeLayout
|
||||||
|
android:id="@+id/input_opacity"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_below="@id/input_scale"
|
||||||
|
android:layout_alignParentStart="true"
|
||||||
|
android:clickable="false">
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/input_opacity_name"
|
||||||
|
style="@style/TextAppearance.AppCompat.Headline"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_alignParentStart="true"
|
||||||
|
android:layout_alignParentTop="true"
|
||||||
|
android:layout_marginStart="@dimen/spacing_large"
|
||||||
|
android:layout_marginTop="@dimen/spacing_large"
|
||||||
|
android:layout_marginEnd="@dimen/spacing_large"
|
||||||
|
android:text="@string/emulation_control_opacity"
|
||||||
|
android:textSize="16sp"
|
||||||
|
tools:text="@string/overclock_enable" />
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/input_opacity_value"
|
||||||
|
android:layout_width="40dp"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_below="@+id/input_opacity_name"
|
||||||
|
android:layout_alignParentEnd="true"
|
||||||
|
android:layout_marginStart="@dimen/spacing_small"
|
||||||
|
android:layout_marginTop="@dimen/spacing_medlarge"
|
||||||
|
android:layout_marginEnd="@dimen/spacing_large"
|
||||||
|
android:layout_marginBottom="@dimen/spacing_large"
|
||||||
|
tools:text="99%"
|
||||||
|
android:textAlignment="textEnd"/>
|
||||||
|
|
||||||
|
<SeekBar
|
||||||
|
android:id="@+id/input_opacity_seekbar"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_below="@+id/input_opacity_name"
|
||||||
|
android:layout_alignParentStart="true"
|
||||||
|
android:layout_marginTop="@dimen/spacing_medlarge"
|
||||||
|
android:layout_marginBottom="@dimen/spacing_large"
|
||||||
|
android:layout_toStartOf="@id/input_opacity_value" />
|
||||||
|
|
||||||
|
</RelativeLayout>
|
||||||
|
|
||||||
|
</RelativeLayout>
|
@@ -12,7 +12,7 @@
|
|||||||
|
|
||||||
<item
|
<item
|
||||||
android:id="@+id/menu_emulation_adjust_scale"
|
android:id="@+id/menu_emulation_adjust_scale"
|
||||||
android:title="@string/emulation_control_scale"/>
|
android:title="@string/emulation_control_adjustments"/>
|
||||||
|
|
||||||
<item
|
<item
|
||||||
android:id="@+id/menu_emulation_joystick_rel_center"
|
android:id="@+id/menu_emulation_joystick_rel_center"
|
||||||
|
@@ -12,7 +12,7 @@
|
|||||||
|
|
||||||
<item
|
<item
|
||||||
android:id="@+id/menu_emulation_adjust_scale"
|
android:id="@+id/menu_emulation_adjust_scale"
|
||||||
android:title="@string/emulation_control_scale"/>
|
android:title="@string/emulation_control_adjustments"/>
|
||||||
|
|
||||||
<group android:checkableBehavior="all">
|
<group android:checkableBehavior="all">
|
||||||
<item
|
<item
|
||||||
|
@@ -396,6 +396,8 @@ It can efficiently compress both junk data and encrypted Wii data.
|
|||||||
<string name="emulation_toggle_controls">Toggle Controls</string>
|
<string name="emulation_toggle_controls">Toggle Controls</string>
|
||||||
<string name="emulation_toggle_all">Toggle All</string>
|
<string name="emulation_toggle_all">Toggle All</string>
|
||||||
<string name="emulation_control_scale">Adjust Scale</string>
|
<string name="emulation_control_scale">Adjust Scale</string>
|
||||||
|
<string name="emulation_control_opacity">Adjust Opacity</string>
|
||||||
|
<string name="emulation_control_adjustments">Adjust Controls</string>
|
||||||
<string name="emulation_control_joystick_rel_center">Relative Stick Center</string>
|
<string name="emulation_control_joystick_rel_center">Relative Stick Center</string>
|
||||||
<string name="emulation_control_rumble">Rumble</string>
|
<string name="emulation_control_rumble">Rumble</string>
|
||||||
<string name="emulation_choose_controller">Choose Controller</string>
|
<string name="emulation_choose_controller">Choose Controller</string>
|
||||||
|
Reference in New Issue
Block a user