附录文章1虽然实现了在屏幕左半边随手指上滑/下滑实现明暗度的调节,但是有一个不完美的地方:当手指在屏幕左半边水平左滑/右滑时候,也一样会触发明暗度的调节。这是不完美的,假设当前的那个view是一个视频播放器view,如果用户的手指在水平方向左滑/右滑,显然,意图是快进/快退,而不是调整明暗度,所以需要对附录文章1的代码改进,实现正确的逻辑。
需要改进的地方集中在dispatchTouchEvent,改进思路:如果用户手指在左半边移动的水平(x坐标轴)方向和垂直(y坐标轴)方向的位移,只有当在垂直(y坐标轴)的位移大于水平(x坐标轴)方向时候,才认为这是一次有效的明暗度调节操作,否则判定是水平方向普通位移,然后将此事件不要消费掉,继续往下传递该事件。
改进后的附录文章1上层Java代码:
package zhangphil.app;
import android.app.Activity;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.WindowManager;
import android.widget.TextView;
public class MainActivity extends Activity {
private float startY = 0;//手指按下时的Y坐标
private float startX = 0;//手指按下时的Y坐标
private TextView brightnessTextView;
private View mVideoView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mVideoView = LayoutInflater.from(this).inflate(R.layout.activity_main, null);
setContentView(mVideoView);
brightnessTextView = (TextView) mVideoView.findViewById(R.id.text);
}
/*
* 设置屏幕亮度
* 0 最暗
* 1 最亮
*/
public void setBrightness(float brightness) {
WindowManager.LayoutParams lp = getWindow().getAttributes();
lp.screenBrightness = lp.screenBrightness + brightness / 255.0f;
if (lp.screenBrightness > 1) {
lp.screenBrightness = 1;
} else if (lp.screenBrightness < 0.1) {
lp.screenBrightness = (float) 0.1;
}
getWindow().setAttributes(lp);
float sb = lp.screenBrightness;
brightnessTextView.setText((int) Math.ceil(sb * 100) + "%");
}
@Override
public boolean onTouchEvent(MotionEvent event) {
int screenWidth = mVideoView.getWidth();
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
startX = event.getX();
startY = event.getY();
break;
case MotionEvent.ACTION_MOVE:
float endX = event.getX();
float endY = event.getY();
float distanceY = startY - endY;
if (startX > screenWidth / 2) {
//右边
//在这里处理音量
} else {
//这段代码是为了修复一个bug
//bug:当手指在屏幕左边水平移动时候本来应该是快进快退,但是却变成敏感度调整
//增加这一些代码,可以实现在屏幕左边水平移动时候是快进快退逻辑,而不是调整明暗度
// by phil
float distanceX = Math.abs(endX - startX);
if (distanceX > Math.abs(distanceY)) {
//Log.d("位移",distanceX+","+distanceY);
return false;
}
//屏幕左半部分上滑,亮度变大,下滑,亮度变小
final double FLING_MIN_DISTANCE = 1;
final double FLING_MIN_VELOCITY = 1;
if (distanceY > FLING_MIN_DISTANCE && Math.abs(distanceY) > FLING_MIN_VELOCITY) {
setBrightness(10);
}
if (distanceY < FLING_MIN_DISTANCE && Math.abs(distanceY) > FLING_MIN_VELOCITY) {
setBrightness(-10);
}
}
break;
}
return super.onTouchEvent(event);
}
}
布局文件:
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http:///apk/res/android"
android:id="@+id/activity_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@mipmap/ic_launcher">
<TextView
android:id="@+id/text"
android:layout_width="150dp"
android:layout_height="50dp"
android:layout_gravity="center"
android:background="@android:color/holo_orange_light"
android:gravity="center"
android:textColor="@android:color/white" />
</FrameLayout>
附录:
1,《Android视频播放器屏幕左侧边随手指上下滑动亮度调节变暗变亮原理实现》链接地址:http:///zhangphil/article/details/56831156