Android VideoPlayer(1)

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行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值