toggleMediaControlsVisiblity();
}
}
return super.onKeyDown(keyCode, event);
}
private void toggleMediaControlsVisiblity() {
if (mediaController.isShowing()) {
mediaController.hide();
} else {
mediaController.show();
}
}
public void start() {
if (mediaPlayer != null && isPrepared) {
mediaPlayer.start();
startWhenPrepared = false;
} else {
startWhenPrepared = true;
}
}
public void pause() {
if (mediaPlayer != null && isPrepared) {
if (mediaPlayer.isPlaying()) {
mediaPlayer.pause();
}
}
startWhenPrepared = false;
}
public int getDuration() {
if (mediaPlayer != null && isPrepared) {
if (mDuration > 0) {
return mDuration;
}
mDuration = mediaPlayer.getDuration();
return mDuration;
}
mDuration = -1;
return mDuration;
}
public int getCurrentPosition() {
if (mediaPlayer != null && isPrepared) {
return mediaPlayer.getCurrentPosition();
}
return 0;
}
public void seekTo(int msec) {
if (mediaPlayer != null && isPrepared) {
mediaPlayer.seekTo(msec);
} else {
seekWhenPrepared = msec;
}
}
public boolean isPlaying() {
if (mediaPlayer != null && isPrepared) {
return mediaPlayer.isPlaying();
}
return false;
}
public int getBufferPercentage() {
if (mediaPlayer != null) {
return currentBufferPercentage;
}
return 0;
}
@Override
public boolean canPause() {
return false;
}
@Override
public boolean canSeekBackward() {
return false;
}
@Override
public boolean canSeekForward() {
return false;
}
@Override
public int getAudioSessionId() {
return 0;
}
}
VolumeView:
package com.tchip.autoplayer.view;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Rect;
import android.media.AudioManager;
import android.util.AttributeSet;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
import com.tchip.autoplayer.R;
public class VolumeView extends View {
public final static String TAG = “SoundView”;
private Context context;
/**
- 音量条高亮
*/
private Bitmap bitmapVolumeLineOn;
private Bitmap bitmapVolumeLineOff;
private int bitmapWidth, bitmapHeight;
private int index;
private OnVolumeChangedListener mOnVolumeChangedListener;
private final static int HEIGHT = 11;
public final static int MY_HEIGHT = 163;
public final static int MY_WIDTH = 44;
public interface OnVolumeChangedListener {
public void setYourVolume(int index);
}
public void setOnVolumeChangeListener(OnVolumeChangedListener l) {
mOnVolumeChangedListener = l;
}
public VolumeView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
context = context;
init();
}
public VolumeView(Context context, AttributeSet attrs) {
super(context, attrs);
context = context;
init();
}
public VolumeView(Context context) {
super(context);
context = context;
init();
}
private void init() {
bitmapVolumeLineOn = BitmapFactory.decodeResource(context.getResources(),
R.drawable.volume_line_on);
bitmapVolumeLineOff = BitmapFactory.decodeResource(context.getResources(),
R.drawable.volume_line_off);
bitmapWidth = bitmapVolumeLineOn.getWidth();
bitmapHeight = bitmapVolumeLineOn.getHeight();
//setIndex(5);
AudioManager am = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);
setIndex(am.getStreamVolume(AudioManager.STREAM_MUSIC));
}
@Override
public boolean onTouchEvent(MotionEvent event) {
int y = (int) event.getY();
int n = y * 15 / MY_HEIGHT;
setIndex(15 - n);
Log.d(TAG, "setIndex: " + (15 - n));
return true;
}
@Override
protected void onDraw(Canvas canvas) {
int reverseIndex = 15 - index;
for (int i = 0; i != reverseIndex; ++i) {
canvas.drawBitmap(bitmapVolumeLineOff, new Rect(0, 0, bitmapWidth, bitmapHeight),
new Rect(0, i * HEIGHT, bitmapWidth, i * HEIGHT + bitmapHeight), null);
}
for (int i = reverseIndex; i != 15; ++i) {
canvas.drawBitmap(bitmapVolumeLineOn, new Rect(0, 0, bitmapWidth, bitmapHeight),
new Rect(0, i * HEIGHT, bitmapWidth, i * HEIGHT + bitmapHeight), null);
}
super.onDraw(canvas);
}
private void setIndex(int n) {
if (n > 15) {
n = 15;
} else if (n < 0) {
n = 0;
}
if (index != n) {
index = n;
if (mOnVolumeChangedListener != null) {
mOnVolumeChangedListener.setYourVolume(n);
}
}
invalidate();
}
}
VideoPlayerActivity:
package com.tchip.autoplayer;
import java.io.File;
import java.io.FileFilter;
import java.util.LinkedList;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.pm.ActivityInfo;
import android.content.res.Configuration;
import android.database.Cursor;
import android.media.AudioManager;
import android.media.MediaPlayer;
import android.media.MediaPlayer.OnCompletionListener;
import android.media.MediaPlayer.OnErrorListener;
import android.media.MediaPlayer.OnPreparedListener;
import android.net.Uri;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import android.os.MessageQueue.IdleHandler;
import android.provider.MediaStore;
import android.util.Log;
import android.view.Display;
import android.view.Gravity;
import android.view.MotionEvent;
import android.view.View;
import android.view.WindowManager;
import android.view.View.OnClickListener;
import android.view.View.OnLongClickListener;
import android.view.ViewGroup.LayoutParams;
import android.widget.ImageButton;
import android.widget.PopupWindow;
import android.widget.SeekBar;
import android.widget.TextView;
import android.widget.SeekBar.OnSeekBarChangeListener;
import android.view.GestureDetector;
import android.view.GestureDetector.SimpleOnGestureListener;
import com.tchip.autoplayer.model.VideoInfo;
import com.tchip.autoplayer.view.VolumeView;
import com.tchip.autoplayer.view.VideoView;
public class VideoPlayerActivity extends Activity {
private final static String TAG = “VideoPlayerActivity”;
private boolean isOnline = false;
private boolean isChangedVideo = false;
public static LinkedList playList = new LinkedList();
private Uri videoListUri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI;
private static int position;
private static boolean backFromAD = false;
private int playedTime;
/**
- 视频视图
*/
private VideoView videoView;
private SeekBar seekBar;
/**
- 视频总时间
*/
private TextView textTimeTotal;
/**
- 已播放时间
*/
private TextView textTimePlay;
private GestureDetector mGestureDetector = null;
private AudioManager mAudioManager = null;
private int maxVolume = 0;
private int currentVolume = 0;
/**
- 视频列表按钮
*/
private ImageButton btnList;
/**
- 上一部按钮
*/
private ImageButton btnPrevious;
/**
- 播放/暂停
*/
private ImageButton btnState;
/**
- 下一部按钮
*/
private ImageButton btnNext;
/**
- 调节音量按钮
*/
private ImageButton btnVolume;
private View controlView = null;
private PopupWindow popupControl;
/**
- 音量视图
*/
private VolumeView volumeView;
private PopupWindow popupVolume;
private View extralView;
private PopupWindow extralWindow = null;
private static int screenWidth = 0;
private static int screenHeight = 0;
private static int controlHeight = 0;
private final static int TIME = 6868;
private boolean isControllerShow = true;
private boolean isPaused = false;
private boolean isFullScreen = false;
private boolean isSilent = false;
private boolean isSoundShow = false;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// initialLayout();
Looper.myQueue().addIdleHandler(new IdleHandler() {
@Override
public boolean queueIdle() {
if (popupControl != null && videoView.isShown()) {
popupControl.showAtLocation(videoView, Gravity.BOTTOM, 0, 0);
// controler.update(screenWidth, controlHeight);
popupControl.update(0, 0, screenWidth, controlHeight);
}
if (extralWindow != null && videoView.isShown()) {
extralWindow.showAtLocation(videoView, Gravity.TOP, 0, 0);
extralWindow.update(0, 25, screenWidth, 60);
}
// myHandler.sendEmptyMessageDelayed(HIDE_CONTROLER, TIME);
return false;
}
});
controlView = getLayoutInflater().inflate(R.layout.controler, null);
popupControl = new PopupWindow(controlView);
textTimeTotal = (TextView) controlView.findViewById(R.id.textTimeTotal);
textTimePlay = (TextView) controlView.findViewById(R.id.textTimePlay);
volumeView = new VolumeView(this);
volumeView.setOnVolumeChangeListener(new VolumeView.OnVolumeChangedListener() {
@Override
public void setYourVolume(int index) {
cancelDelayHide();
updateVolume(index);
hideControllerDelay();
}
});
popupVolume = new PopupWindow(volumeView);
extralView = getLayoutInflater().inflate(R.layout.extral, null);
extralWindow = new PopupWindow(extralView);
ImageButton btnBack = (ImageButton) extralView
.findViewById(R.id.btnBack);
position = -1;
btnBack.setOnClickListener(myOnClickListener);
btnList = (ImageButton) controlView.findViewById(R.id.btnList);
btnPrevious = (ImageButton) controlView.findViewById(R.id.btnPrevious);
btnState = (ImageButton) controlView.findViewById(R.id.btnState);
btnNext = (ImageButton) controlView.findViewById(R.id.btnNext);
btnVolume = (ImageButton) controlView.findViewById(R.id.btnVolume);
videoView = (VideoView) findViewById(R.id.videoView);
videoView.setOnErrorListener(new OnErrorListener() {
@Override
public boolean onError(MediaPlayer mp, int what, int extra) {
videoView.stopPlayback();
isOnline = false;
new AlertDialog.Builder(VideoPlayerActivity.this)
.setTitle(“Error”)
.setMessage(“?”)
.setPositiveButton(“Confirm”,
new AlertDialog.OnClickListener() {
@Override
public void onClick(DialogInterface dialog,
int which) {
videoView.stopPlayback();
}
}).setCancelable(false).show();
return false;
}
});
Uri uri = getIntent().getData();
if (uri != null) {
videoView.stopPlayback();
videoView.setVideoURI(uri);
isOnline = true;
btnState.setImageResource(R.drawable.pause);
} else {
btnState.setImageResource(R.drawable.play);
}
getVideoFile(playList, new File(“/sdcard/”));
if (android.os.Environment.getExternalStorageState().equals(
android.os.Environment.MEDIA_MOUNTED)) {
Cursor cursor = getContentResolver()
.query(videoListUri,
new String[]{“_display_name”, “_data”}, null,
null, null);
int n = cursor.getCount();
cursor.moveToFirst();
LinkedList playList2 = new LinkedList();
for (int i = 0; i != n; ++i) {
VideoInfo videoInfo = new VideoInfo(cursor.getString(cursor
.getColumnIndex(“_display_name”)), cursor.getString(cursor.getColumnIndex(“_data”)));
playList2.add(videoInfo);
cursor.moveToNext();
}
if (playList2.size() > playList.size()) {
playList = playList2;
}
}
videoView.setMySizeChangeLinstener(new VideoView.MySizeChangeLinstener() {
@Override
public void doMyThings() {
setVideoScale(SCREEN_DEFAULT);
}
});
btnList.setAlpha(0xBB);
btnPrevious.setAlpha(0xBB);
btnState.setAlpha(0xBB);
btnNext.setAlpha(0xBB);
mAudioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
maxVolume = mAudioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC);
currentVolume = mAudioManager
.getStreamVolume(AudioManager.STREAM_MUSIC);
btnVolume.setAlpha(getAlphaByVolume());
btnList.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
Intent intent = new Intent();
intent.setClass(VideoPlayerActivity.this,
VideoChooseActivity.class);
VideoPlayerActivity.this.startActivityForResult(intent, 0);
cancelDelayHide();
}
});
btnNext.setOnClickListener(myOnClickListener);
btnState.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
cancelDelayHide();
if (isPaused) {
videoView.start();
btnState.setImageResource(R.drawable.pause);
hideControllerDelay();
} else {
videoView.pause();
btnState.setImageResource(R.drawable.play);
}
isPaused = !isPaused;
}
});
btnPrevious.setOnClickListener(myOnClickListener);
btnVolume.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
cancelDelayHide();
if (isSoundShow) {
popupVolume.dismiss();
} else {
if (popupVolume.isShowing()) {
popupVolume.update(15, 0, VolumeView.MY_WIDTH,
VolumeView.MY_HEIGHT);
} else {
popupVolume.showAtLocation(videoView, Gravity.RIGHT
| Gravity.CENTER_VERTICAL, 15, 0);
popupVolume.update(15, 0, VolumeView.MY_WIDTH,
VolumeView.MY_HEIGHT);
}
}
isSoundShow = !isSoundShow;
hideControllerDelay();
}
});
btnVolume.setOnLongClickListener(new OnLongClickListener() {
@Override
public boolean onLongClick(View arg0) {
if (isSilent) {
btnVolume.setImageResource(R.drawable.soundenable);
} else {
btnVolume.setImageResource(R.drawable.sounddisable);
}
isSilent = !isSilent;
updateVolume(currentVolume);
cancelDelayHide();
hideControllerDelay();
return true;
}
});
seekBar = (SeekBar) controlView.findViewById(R.id.seekbar);
seekBar.setOnSeekBarChangeListener(new OnSeekBarChangeListener() {
@Override
public void onProgressChanged(SeekBar seekbar, int progress,
boolean fromUser) {
if (fromUser) {
if (!isOnline) {
videoView.seekTo(progress);
}
}
}
@Override
public void onStartTrackingTouch(SeekBar arg0) {
myHandler.removeMessages(HIDE_CONTROLER);
}
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
myHandler.sendEmptyMessageDelayed(HIDE_CONTROLER, TIME);
}
});
getScreenSize();
mGestureDetector = new GestureDetector(new SimpleOnGestureListener() {
@Override
public boolean onDoubleTap(MotionEvent e) {
if (isFullScreen) {
setVideoScale(SCREEN_DEFAULT);
} else {
setVideoScale(SCREEN_FULL);
}
isFullScreen = !isFullScreen;
Log.d(TAG, “onDoubleTap”);
if (isControllerShow) {
showController();
}
// return super.onDoubleTap(e);
return true;
}
@Override
public boolean onSingleTapConfirmed(MotionEvent e) {
if (!isControllerShow) {
showController();
hideControllerDelay();
} else {
cancelDelayHide();
hideController();
}
// return super.onSingleTapConfirmed(e);
return true;
}
@Override
public void onLongPress(MotionEvent e) {
if (isPaused) {
videoView.start();
btnState.setImageResource(R.drawable.pause);
cancelDelayHide();
hideControllerDelay();
} else {
videoView.pause();
btnState.setImageResource(R.drawable.play);
cancelDelayHide();
showController();
}
isPaused = !isPaused;
// super.onLongPress(e);
}
});
// vv.setVideoPath(“http://202.108.16.171/cctv/video/A7/E8/69/27/A7E86927D2BF4D2FA63471D1C5F97D36/gphone/480_320/200/0.mp4”);
videoView.setOnPreparedListener(new OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer arg0) {
setVideoScale(SCREEN_DEFAULT);
isFullScreen = false;
if (isControllerShow) {
showController();
}
int i = videoView.getDuration();
Log.d(“onCompletion”, “” + i);
seekBar.setMax(i);
i /= 1000;
int minute = i / 60;
int hour = minute / 60;
int second = i % 60;
minute %= 60;
textTimeTotal.setText(String.format(“%02d:%02d:%02d”, hour,
minute, second));
/*
-
controler.showAtLocation(vv, Gravity.BOTTOM, 0, 0);
-
controler.update(screenWidth, controlHeight);
-
myHandler.sendEmptyMessageDelayed(HIDE_CONTROLER, TIME);
*/
videoView.start();
btnState.setImageResource(R.drawable.pause);
hideControllerDelay();
myHandler.sendEmptyMessage(PROGRESS_CHANGED);
}
});
videoView.setOnCompletionListener(new OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer arg0) {
int n = playList.size();
isOnline = false;
if (++position < n) {
videoView.setVideoPath(playList.get(position).getPath());
} else {
videoView.stopPlayback();
VideoPlayerActivity.this.finish();
}
}
});
}
@Override
protected void onResume() {
if (!isChangedVideo) {
videoView.seekTo(playedTime);
videoView.start();
} else {
isChangedVideo = false;
}
// if(videoView.getVideoHeight()!=0){
if (videoView.isPlaying()) {
btnState.setImageResource(R.drawable.pause);
hideControllerDelay();
}
if (getRequestedOrientation() != ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE) {
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
}
super.onResume();
}
@Override
protected void onDestroy() {
if (popupControl.isShowing()) {
popupControl.dismiss();
extralWindow.dismiss();
}
if (popupVolume.isShowing()) {
popupVolume.dismiss();
}
myHandler.removeMessages(PROGRESS_CHANGED);
myHandler.removeMessages(HIDE_CONTROLER);
if (videoView.isPlaying()) {
videoView.stopPlayback();
}
playList.clear();
super.onDestroy();
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == 0 && resultCode == Activity.RESULT_OK) {
videoView.stopPlayback();
int result = data.getIntExtra(“CHOOSE”, -1);
Log.d(“RESULT”, “” + result);
if (result != -1) {
isOnline = false;
isChangedVideo = true;
videoView.setVideoPath(playList.get(result).getPath());
position = result;
} else {
String url = data.getStringExtra(“CHOOSE_URL”);
if (url != null) {
videoView.setVideoPath(url);
isOnline = true;
isChangedVideo = true;
}
}
return;
}
super.onActivityResult(requestCode, resultCode, data);
}
private final static int PROGRESS_CHANGED = 0;
private final static int HIDE_CONTROLER = 1;
Handler myHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case PROGRESS_CHANGED:
int i = videoView.getCurrentPosition();
seekBar.setProgress(i);
if (isOnline) {
int j = videoView.getBufferPercentage();
seekBar.setSecondaryProgress(j * seekBar.getMax() / 100);
} else {
seekBar.setSecondaryProgress(0);
}
i /= 1000;
int minute = i / 60;
int hour = minute / 60;
int second = i % 60;
minute %= 60;
textTimePlay.setText(String.format(“%02d:%02d:%02d”, hour,
minute, second));
sendEmptyMessageDelayed(PROGRESS_CHANGED, 100);
break;
case HIDE_CONTROLER:
hideController();
break;
}
super.handleMessage(msg);
}
};
@Override
public boolean onTouchEvent(MotionEvent event) {
boolean result = mGestureDetector.onTouchEvent(event);
if (!result) {
if (event.getAction() == MotionEvent.ACTION_UP) {
/*
-
if(!isControllerShow){ showController();
-
hideControllerDelay(); }else { cancelDelayHide();
-
hideController(); }
*/
}
result = super.onTouchEvent(event);
}
return result;
}
@Override
public void onConfigurationChanged(Configuration newConfig) {
getScreenSize();
if (isControllerShow) {
cancelDelayHide();
hideController();
showController();
hideControllerDelay();
}
super.onConfigurationChanged(newConfig);
}
@Override
protected void onPause() {
playedTime = videoView.getCurrentPosition();
videoView.pause();
btnState.setImageResource(R.drawable.play);
super.onPause();
}
private void getScreenSize() {
Display display = getWindowManager().getDefaultDisplay();
screenHeight = display.getHeight();
screenWidth = display.getWidth();
controlHeight = screenHeight / 4;
// adView = (AdView) extralView.findViewById(R.id.ad);
// LayoutParams lp = adView.getLayoutParams();
// lp.width = screenWidth*3/5;
}
private void hideController() {
if (popupControl.isShowing()) {
popupControl.update(0, 0, 0, 0);
extralWindow.update(0, 0, screenWidth, 0);
isControllerShow = false;
}
if (popupVolume.isShowing()) {
popupVolume.dismiss();
isSoundShow = false;
}
}
private void hideControllerDelay() {
myHandler.sendEmptyMessageDelayed(HIDE_CONTROLER, TIME);
}
private void showController() {
popupControl.update(0, 0, screenWidth, controlHeight);
if (isFullScreen) {
extralWindow.update(0, 0, screenWidth, 60);
} else {
extralWindow.update(0, 25, screenWidth, 60);
}
isControllerShow = true;
}
private void cancelDelayHide() {
myHandler.removeMessages(HIDE_CONTROLER);
}
private final static int SCREEN_FULL = 0;
private final static int SCREEN_DEFAULT = 1;
private void setVideoScale(int flag) {
LayoutParams lp = videoView.getLayoutParams();
switch (flag) {
case SCREEN_FULL:
Log.d(TAG, "screenWidth: " + screenWidth + " screenHeight: "
- screenHeight);
videoView.setVideoScale(screenWidth, screenHeight);
getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
break;
case SCREEN_DEFAULT:
int videoWidth = videoView.getVideoWidth();
int videoHeight = videoView.getVideoHeight();
int mWidth = screenWidth;
int mHeight = screenHeight - 25;
if (videoWidth > 0 && videoHeight > 0) {
if (videoWidth * mHeight > mWidth * videoHeight) {
// Log.i(“@@@”, “image too tall, correcting”);
mHeight = mWidth * videoHeight / videoWidth;
} else if (videoWidth * mHeight < mWidth * videoHeight) {
// Log.i(“@@@”, “image too wide, correcting”);
mWidth = mHeight * videoWidth / videoHeight;
} else {
}
}
videoView.setVideoScale(mWidth, mHeight);
getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
break;
}
}
private int getAlphaByVolume() {
文末
对于很多初中级Android工程师而言,想要提升技能,往往是自己摸索成长,不成体系的学习效果低效漫长且无助。 整理的这些架构技术希望对Android开发的朋友们有所参考以及少走弯路,本文的重点是你有没有收获与成长,其余的都不重要,希望读者们能谨记这一点。
最后想要拿高薪实现技术提升薪水得到质的飞跃。最快捷的方式,就是有人可以带着你一起分析,这样学习起来最为高效,所以为了大家能够顺利进阶中高级、架构师,我特地为大家准备了一套高手学习的源码和框架视频等精品Android架构师教程,保证你学了以后保证薪资上升一个台阶。
当你有了学习线路,学习哪些内容,也知道以后的路怎么走了,理论看多了总要实践的。
进阶学习视频
附上:我们之前因为秋招收集的二十套一二线互联网公司Android面试真题 (含BAT、小米、华为、美团、滴滴)和我自己整理Android复习笔记(包含Android基础知识点、Android扩展知识点、Android源码解析、设计模式汇总、Gradle知识点、常见算法题汇总。)
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
flag) {
LayoutParams lp = videoView.getLayoutParams();
switch (flag) {
case SCREEN_FULL:
Log.d(TAG, "screenWidth: " + screenWidth + " screenHeight: "
- screenHeight);
videoView.setVideoScale(screenWidth, screenHeight);
getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
break;
case SCREEN_DEFAULT:
int videoWidth = videoView.getVideoWidth();
int videoHeight = videoView.getVideoHeight();
int mWidth = screenWidth;
int mHeight = screenHeight - 25;
if (videoWidth > 0 && videoHeight > 0) {
if (videoWidth * mHeight > mWidth * videoHeight) {
// Log.i(“@@@”, “image too tall, correcting”);
mHeight = mWidth * videoHeight / videoWidth;
} else if (videoWidth * mHeight < mWidth * videoHeight) {
// Log.i(“@@@”, “image too wide, correcting”);
mWidth = mHeight * videoWidth / videoHeight;
} else {
}
}
videoView.setVideoScale(mWidth, mHeight);
getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
break;
}
}
private int getAlphaByVolume() {
文末
对于很多初中级Android工程师而言,想要提升技能,往往是自己摸索成长,不成体系的学习效果低效漫长且无助。 整理的这些架构技术希望对Android开发的朋友们有所参考以及少走弯路,本文的重点是你有没有收获与成长,其余的都不重要,希望读者们能谨记这一点。
最后想要拿高薪实现技术提升薪水得到质的飞跃。最快捷的方式,就是有人可以带着你一起分析,这样学习起来最为高效,所以为了大家能够顺利进阶中高级、架构师,我特地为大家准备了一套高手学习的源码和框架视频等精品Android架构师教程,保证你学了以后保证薪资上升一个台阶。
当你有了学习线路,学习哪些内容,也知道以后的路怎么走了,理论看多了总要实践的。
进阶学习视频
[外链图片转存中…(img-ykcBL3If-1714297587582)]
附上:我们之前因为秋招收集的二十套一二线互联网公司Android面试真题 (含BAT、小米、华为、美团、滴滴)和我自己整理Android复习笔记(包含Android基础知识点、Android扩展知识点、Android源码解析、设计模式汇总、Gradle知识点、常见算法题汇总。)
[外链图片转存中…(img-uJuB1RLa-1714297587583)]
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!