Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология
Образование Политология Производство Психология Стандартизация Технологии


Воспроизведение файла из интернета



VideoView поддерживает воспроизведение файла из интернета. Но чтобы это стало возможно, необходимо в файле AndroidManifest.xml установить разрешение android.permission.INTERNET, так как мы получаем данные из интернета:

< uses-permission android: name=" android.permission.INTERNET" />

Файл манифеста полностью:

<? xml version=" 1.0" encoding=" utf-8"? > < manifest xmlns: android=" http: //schemas.android.com/apk/res/android" package=" com.example.eugene.mediaapp" > < uses-permission android: name=" android.permission.INTERNET" /> < application   android: allowBackup=" true"    android: icon=" @mipmap/ic_launcher"    android: label=" @string/app_name"    android: roundIcon=" @mipmap/ic_launcher_round"    android: supportsRtl=" true"    android: theme=" @style/AppTheme" >    < activity android: name=".MainActivity" >        < intent-filter>            < action android: name=" android.intent.action.MAIN" />            < category android: name=" android.intent.category.LAUNCHER" />        < /intent-filter>    < /activity> < /application> < /manifest>

Далее изменим класс MainActivity:

package com.example.eugene.mediaapp; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.widget.VideoView; public class MainActivity extends AppCompatActivity { VideoView videoPlayer; @Override protected void onCreate(Bundle savedInstanceState) {   super.onCreate(savedInstanceState);    setContentView(R.layout.activity_main);    videoPlayer = (VideoView)findViewById(R.id.videoPlayer);    videoPlayer.setVideoPath(" http: //video.ch9.ms/ch9/507d/71f4ef0f-3b81-4d2c-956f-c56c81f9507d/AndroidEmulatorWithMacEmulator.mp4" ); } public void play(View view){   videoPlayer.start(); } public void pause(View view){   videoPlayer.pause(); } public void stop(View view){   videoPlayer.stopPlayback();    videoPlayer.resume(); }}

Здесь нам надо в метод videoPlayer.setVideoPath() передать интернет-адрес воспроизводимого файла.



Воспроизведение аудио

Для воспроизведения музыки и других аудиоматериалов Android предоставляет класс MediaPlayer.

Чтобы воспроизводить аудио, MediaPlayer должен знать, какой именно ресурс (файл) нужно производить. Установить нужный ресурс для воспроизведения можно тремя способами:

  • в метод create() объекта MediaPlayer передается id ресурса, представляющего аудиофайл
  • в метод create() объекта MediaPlayer передается объект Uri, представляющего аудиофайл
  • в метод setDataSource() объекта MediaPlayer передается полный путь к аудиофайлу

После установки ресурса вызывается метод prepare() или prepareAsync() (асинхронный вариант prepare()). Этот метод подготавливает аудиофайл к воспроизведению, извлекая из него первые секунды. Если мы воспроизводим файл из сети, то лучше использовать prepareAsync().

Для управления воспроизведением в классе MediaPlayer определены следующие методы:

  • start(): запускает аудио
  • pause(): приостанавливает воспроизведение
  • stop(): полностью останавливает воспроизведение

Итак, создадим новый проект. Как и в случае с видео, аудиофайл должен находиться в папке res/raw, поэтому добавим в проект в Android Studio такую папку и скопируем в нее какой-нибудь аудио-файл.

Для управления аудиопотоком определим в файле activity_main.xml три кнопки:

<? xml version=" 1.0" encoding=" utf-8"? >

< LinearLayout xmlns: android=" http: //schemas.android.com/apk/res/android"

android: layout_width=" match_parent"

android: layout_height=" match_parent"

android: orientation=" horizontal"

android: padding=" 16dp" >

< Button

   android: id=" @+id/start"

   android: layout_width=" 0dp"

   android: layout_height=" wrap_content"

   android: layout_weight=" 1"

   android: text=" Play"

   android: onClick=" play" />

< Button

   android: id=" @+id/pause"

   android: layout_width=" 0dp"

   android: layout_height=" wrap_content"

   android: layout_weight=" 1"

   android: text=" Pause"

   android: onClick=" pause" />

< Button

   android: id=" @+id/stop"

   android: layout_width=" 0dp"

   android: layout_height=" wrap_content"

   android: layout_weight=" 1"

   android: text=" Stop"

   android: onClick=" stop" />

< /LinearLayout>

И изменим код класса MainActivity:

package com.example.eugene.mediaapp;

 

import android.media.MediaPlayer;

import android.support.v7.app.AppCompatActivity;

import android.os.Bundle;

import android.view.View;

import android.widget.Button;

import android.widget.Toast;

 

public class MainActivity extends AppCompatActivity {

 

MediaPlayer mPlayer;

Button startButton, pauseButton, stopButton;

@Override

protected void onCreate(Bundle savedInstanceState) {

   super.onCreate(savedInstanceState);

   setContentView(R.layout.activity_main);

 

   mPlayer=MediaPlayer.create(this, R.raw.music);

   mPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {

       @Override

       public void onCompletion(MediaPlayer mp) {

           stopPlay();

       }

   });

   startButton = (Button) findViewById(R.id.start);

   pauseButton = (Button) findViewById(R.id.pause);

   stopButton = (Button) findViewById(R.id.stop);

 

   pauseButton.setEnabled(false);

   stopButton.setEnabled(false);

}

private void stopPlay(){

   mPlayer.stop();

   pauseButton.setEnabled(false);

   stopButton.setEnabled(false);

   try {

       mPlayer.prepare();

       mPlayer.seekTo(0);

       startButton.setEnabled(true);

   }

   catch (Throwable t) {

       Toast.makeText(this, t.getMessage(), Toast.LENGTH_SHORT).show();

    }

}

 

public void play(View view){

 

   mPlayer.start();

   startButton.setEnabled(false);

   pauseButton.setEnabled(true);

   stopButton.setEnabled(true);

}

public void pause(View view){

 

   mPlayer.pause();

    startButton.setEnabled(true);

   pauseButton.setEnabled(false);

   stopButton.setEnabled(true);

}

public void stop(View view){

   stopPlay();

}

@Override

public void onDestroy() {

   super.onDestroy();

   if (mPlayer.isPlaying()) {

       stopPlay();

   }

}

}

Обработчик каждой кнопки кроме вызова определенного метода у MediaPlayer также переключает доступность кнопок.

И если запуск и приостановка воспроизведения особых сложностей не вызывает, то при обработки полной остановки воспроизведения мы можем столкнуться с рядом трудностей. В частности, когда мы выходим из приложения - полностью закрываем его через диспетчер приложений либо нажимаем на кнопку Назад, то у нас для текущей Activity вызывается метод onDestroy, activity уничтожаетя, но MediaPlayer продолжает работать. Если мы вернемся к приложению, то activity будет создана заново, но с помощью кнопок мы не сможем управлять воспроизведением. Поэтому в даном случае переопределяем метод onDestroy, в котором завершаем воспроизведение.

Для корректного завершения также определен обработчик естественного завершения воспроизведения OnCompletionListener, действие которого будет аналогично нажатию на кнопку " Стоп".

Добавим к воспроизведению индикатор громкости. Для этого в файле activity_main.xml определим SeekBar:

<? xml version=" 1.0" encoding=" utf-8"? >

< LinearLayout xmlns: android=" http: //schemas.android.com/apk/res/android"

android: layout_width=" match_parent"

android: layout_height=" match_parent"

android: orientation=" vertical"

android: padding=" 16dp" >

< LinearLayout

   android: layout_width=" match_parent"

   android: layout_height=" wrap_content" >

   < Button

       android: id=" @+id/start"

       android: layout_width=" 0dp"

       android: layout_height=" wrap_content"

       android: layout_weight=" 1"

       android: text=" Play"

       android: onClick=" play" />

   < Button

       android: id=" @+id/pause"

       android: layout_width=" 0dp"

       android: layout_height=" wrap_content"

       android: layout_weight=" 1"

       android: text=" Pause"

       android: onClick=" pause" />

   < Button

       android: id=" @+id/stop"

       android: layout_width=" 0dp"

       android: layout_height=" wrap_content"

       android: layout_weight=" 1"

       android: text=" Stop"

       android: onClick=" stop" />

< /LinearLayout>

< SeekBar

  android: id=" @+id/volumeControl"

  android: layout_width=" match_parent"

  android: layout_height=" wrap_content"

  android: layout_marginTop=" 32dp" />

< SeekBar

   android: id=" @+id/progressControl"

   android: layout_width=" match_parent"

   android: layout_height=" wrap_content"

   android: layout_marginTop=" 32dp" />

< /LinearLayout>

И далее изменим MainActivity:

package com.example.eugene.mediaapp;

 

import android.content.Context;

import android.media.AudioManager;

import android.media.MediaPlayer;

import android.os.Handler;

import android.support.v7.app.AppCompatActivity;

import android.os.Bundle;

import android.view.View;

import android.widget.Button;

import android.widget.SeekBar;

import android.widget.Toast;

 

public class MainActivity extends AppCompatActivity {

 

MediaPlayer mPlayer;

Button startButton, pauseButton, stopButton;

SeekBar volumeControl;

AudioManager audioManager;

 

@Override

protected void onCreate(Bundle savedInstanceState) {

   super.onCreate(savedInstanceState);

   setContentView(R.layout.activity_main);

 

   mPlayer=MediaPlayer.create(this, R.raw.music);

   mPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {

       @Override

       public void onCompletion(MediaPlayer mp) {

           stopPlay();

       }

   });

   startButton = (Button) findViewById(R.id.start);

   pauseButton = (Button) findViewById(R.id.pause);

   stopButton = (Button) findViewById(R.id.stop);

 

   audioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);

   int maxVolume = audioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC);

   int curValue = audioManager.getStreamVolume(AudioManager.STREAM_MUSIC);

 

   volumeControl = (SeekBar) findViewById(R.id.volumeControl);

   volumeControl.setMax(maxVolume);

   volumeControl.setProgress(curValue);

   volumeControl.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {

       @Override

       public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {

           audioManager.setStreamVolume(AudioManager.STREAM_MUSIC, progress, 0);

       }

       @Override

       public void onStartTrackingTouch(SeekBar seekBar) {

 

       }

       @Override

       public void onStopTrackingTouch(SeekBar seekBar) {

 

       }

   });

 

   pauseButton.setEnabled(false);

   stopButton.setEnabled(false);

}

private void stopPlay(){

   mPlayer.stop();

   pauseButton.setEnabled(false);

   stopButton.setEnabled(false);

   try {

       mPlayer.prepare();

       mPlayer.seekTo(0);

       startButton.setEnabled(true);

   }

   catch (Throwable t) {

       Toast.makeText(this, t.getMessage(), Toast.LENGTH_SHORT).show();

   }

}

 

public void play(View view){

 

   mPlayer.start();

   startButton.setEnabled(false);

   pauseButton.setEnabled(true);

   stopButton.setEnabled(true);

}

public void pause(View view){

 

   mPlayer.pause();

   startButton.setEnabled(true);

   pauseButton.setEnabled(false);

   stopButton.setEnabled(true);

}

public void stop(View view){

   stopPlay();

}

@Override

public void onDestroy() {

   super.onDestroy();

   if (mPlayer.isPlaying()) {

       stopPlay();

   }

}

}

Для управления громкостью звука применяется класс AudioManager. А в с помощью вызова audioManager.setStreamVolume(AudioManager.STREAM_MUSIC, progress, 0); в качестве второго параметра можно передать нужное значение громкости.



Анимация

Cell-анимация

Cell animation представляет собой технику анимации, при которой ряд изображений или кадров последовательно сменяют друг друга за короткий промежуток времени. Подобная техника довольно распространена при создании мультфильмов. Например, имеется следующий набор изображений:

При достаточно быстрой смене кадров получится динамический эффект зайца, забрасывающего мяч в баскетбольную корзину. Теперь рассмотрим, как сделать подобную анимацию в приложении Android.

Во-первых, нам надо добавить все эти изображения в проект в папку res/drawable. И в эту же папку добавим новый xml-файл. Назовем его rabit_animation.xml и поместим в него следующее содержимое:

<? xml version=" 1.0" encoding=" utf-8"? > < animation-list xmlns: android=" http: //schemas.android.com/apk/res/android" android: oneshot=" false" > < item android: drawable=" @drawable/a1" android: duration=" 250" /> < item android: drawable=" @drawable/a2" android: duration=" 250" /> < item android: drawable=" @drawable/a3" android: duration=" 250" /> < item android: drawable=" @drawable/a4" android: duration=" 250" /> < item android: drawable=" @drawable/a5" android: duration=" 250" /> < item android: drawable=" @drawable/a6" android: duration=" 250" /> < item android: drawable=" @drawable/a7" android: duration=" 250" /> < /animation-list>

Анимация определяется с помощью корневого элемента animation-list, который содержит набор ключевых кадров в виде элементов item.

Свойство android: oneshot=" false" в определении корневого элемента указывает, что анимация будут продолжатся циклически. А при значении true анимация срабатывала только один раз.

Каждый элемент аннимации устанавливает ссылку на ресурс изображения с помощью свойства android: drawable, а также с помощью свойства android: duration устанавливает время в миллисекундах, которое будет отображаться изображение.

В разметке интерфейса для отображения анимации используется элемент ImageView:

< RelativeLayout xmlns: android=" http: //schemas.android.com/apk/res/android" android: orientation=" vertical" android: layout_width=" match_parent" android: layout_height=" match_parent" > < ImageView android: id=" @+id/animationView"             android: layout_width=" wrap_content"    android: layout_height=" wrap_content"    android: src=" @drawable/rabit_animation"    android: adjustViewBounds=" true" android: padding=" 40dip" /> < /RelativeLayout>

Для установки ресурса анимации применяется свойство android: src, и также для растягивания по ширине контейнера с сохранением аспектного онтошения между шириной и высотой используется свойство android: adjustViewBounds=" true"

Больше для запуска анимации ничего не надо. И при запуске приложения анимация будет автоматически запускаться.

Также можно установить анимацию в коде java:

ImageView img = (ImageView)findViewById(R.id.animationView); img.setBackgroundResource(R.drawable.rabit_animation); // получаем объект анимацииAnimationDrawable frameAnimation = (AnimationDrawable) img.getBackground(); frameAnimation.setOneShot(false); // запуск анимацииframeAnimation.start();

Tween-анимация

Tween-анимация представляет анимацию различных свойств объекта, при которой система сама расчитывает некоторые промежуточные значения с помощью определенного алгоритма, который называется интерполяцией. В Android алгоритм интерполяции определяется встроенным классом Animation.

От данного класса наследуются классы, которые описывают конкретные типы анимаций, такие как AlphaAnimation (изменение прозрачности), RotateAnimation (анимация вращения), ScaleAnimation (анимация масштабирования), TranslateAnimation (анимация перемещения).

Мы можем определить анимацию как в коде java, так и в файле xml. Для хранения ресурсов анимации в папке res предназначена папка anim. По умолчанию данная папка отсуствует в проекте, поэтому создадим ее. Затем добавим в нее новый xml-файл, который назовем common_animation.xml:

Определим в этом файле следующее содержание:

<? xml version=" 1.0" encoding=" utf-8"? > < set xmlns: android=" http: //schemas.android.com/apk/res/android" android: interpolator=" @android: anim/linear_interpolator" > < scale android: fromXScale=" 1.0" android: toXScale=" 0.5"    android: fromYScale=" 1.0" android: toYScale=" 0.5"    android: pivotX=" 50%" android: pivotY=" 50%" android: duration=" 4500"    android: repeatCount=" infinite" android: repeatMode=" reverse" /> < rotate   android: fromDegrees=" 0.0"    android: toDegrees=" 60.0"    android: pivotX=" 50%"    android: pivotY=" 50%" /> < alpha android: fromAlpha=" 1.0" android: toAlpha=" 0.1" android: duration=" 2250"    android: repeatCount=" infinite" android: repeatMode=" reverse" /> < translate android: fromXDelta=" 0.0"    android: toXDelta=" 50.0"    android: fromYDelta=" 20.0"    android: toYDelta=" 80.0"    android: duration=" 2250"    android: repeatMode=" reverse"    android: repeatCount=" infinite" /> < /set>

Здесь задействуются четыре типа анимаций: элемент scale представляет масштабирование, элемент rotate - вращение, элемент alpha - изменение прозрачности, элемент translate - перемещение. Если бы мы использовали одну анимацию, то могли бы определить один корневой элемент по типу анимации. Но так как мы используем набор, то все анимации помещаются в элемент set, который представляет класс AnimationSet

Все виды анимаций принимают ряд общих свойств. В частности, свойство android: repeatMode, которое указывает на редим выполнения. Если имеет значение reverse, то анимация выполняется также и в обратную сторону

Свойство android: repeatCount указывает на количество повторов анимации. Значение infinite устанавливает бесконечное число повторов.

Время анимации задается с помощью свойства android: duration

Для всех анимаций также характерно указание начальной и конечной точки трансформации.

Анимация масштабирования

Для анимация масштабирования задается начальное масштабирование по оси х (android: fromXScale) и по оси y (android: fromYScale) и конечные значения масштабирования android: toXScale и android: toYScale. Например, так как android: fromXScale=1.0, а android: toXScale=0.5, то по ширине будет происходить сжатие на 50%.

Также при масштабировании устанавливаются зачения android: pivotX и android: pivotY, которые указывают на центр масшабирования или опорную точку.

Анимация вращения

Для анимации вращения задается начальное (android: fromDegrees) и конечное значения поворота (android: toDegrees).

С помощью свойств android: pivotX и android: pivotY также, как и при масштабировании, задается опорная точка вращения.

Анимация прозрачности

Для анимации прозрачности задается начальное значение прозрачности (android: fromAlpha) и финальное значение, устанавливамое при завершении анимации (android: toAlpha). Все значения варьируютс в диапазоне от 1.0 (непрозрачный) до 0.0 (полностью прозрачный)

Анимация перемещени

Для перемещения также устанавливаются начальные (android: fromXDelta и android: fromYDelta) и конечные значения (android: toXDelta и android: toYDelta)

Для всех анимаций начальные и конечные значения указывают некий диапазон, в котором будут ранжироваться значения. Само вычисление значений на этом промежутке зависит от конкретного алгоритма. В данном случае в качестве алгоритма устанавливается линейная интерполяция. Для этого у корневого элемента set определено свойство android: interpolator=" @android: anim/linear_interpolator".

Кроме данного значения свойство android: interpolator может принимать еще ряд других: bounce_interpolator, cycle_interpolator и т.д.

Данная анимация будет применяться к элементу ImageView, который определим в файле разметки интерфейса:

< RelativeLayout xmlns: android=" http: //schemas.android.com/apk/res/android" android: orientation=" vertical" android: layout_width=" match_parent" android: layout_height=" match_parent" > < ImageView android: id=" @+id/animationView"    android: layout_width=" wrap_content"     android: layout_height=" wrap_content"    android: adjustViewBounds=" true" android: padding=" 40dip" /> < /RelativeLayout>

Теперь определим и запустим анимацию в классе activity:

package com.example.eugene.myfirstapp; import android.app.Activity; import android.os.Bundle; import android.view.Menu; import android.view.MenuItem; import android.widget.ImageView; import android.view.animation.AnimationUtils; import android.view.animation.Animation; public class MainActivity extends Activity{ @Override protected void onCreate(Bundle savedInstanceState) {   super.onCreate(savedInstanceState);    setContentView(R.layout.activity_main);    ImageView img = (ImageView)findViewById(R.id.animationView);             // определим для ImageView какое-нибудь изображение   img.setImageResource(R.drawable.image2);             // создаем анимацию   Animation animation = AnimationUtils.loadAnimation(this, R.anim.common_animation);             // запуск анимации   img.startAnimation(animation); }}

Сначала определяем анимацию по тому файлу common_animation.xml, который содержит набор анимаций:

Animation animation = AnimationUtils.loadAnimation(this, R.anim.common_animation);

А потом запускаем ее:

img.startAnimation(animation);

 


Поделиться:



Последнее изменение этой страницы: 2019-05-04; Просмотров: 209; Нарушение авторского права страницы


lektsia.com 2007 - 2024 год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! (0.086 с.)
Главная | Случайная страница | Обратная связь