移动应用程序设计基础——安卓动画与视音频播放器的实现

简介: 《移动应用程序设计基础》实验6 安卓动画与视音频播放器的实现通过本实验,使得学生掌握导航的制作基本方法,掌握安卓动画和多媒体播放器的制作。【实验内容】1、 实现底部导航功能,包括Tween动画、Frame动画、音频播放、视频播放四个按键。2、 实现动画功能,其中Tween动画可在界面选择四种类型的动画效果。3、 实现音频播放。4、 实现视频播放。...

 《移动应用程序设计基础》实验6 安卓动画与视音频播放器的实现

实验名称:

实验6 安卓动画与视音频播放器的实现

所使用的工具软件及环境:

JDK1.8,Android Studio

一、实验目的:

【目的】

通过本实验,使得学生掌握导航的制作基本方法,掌握安卓动画和多媒体播放器的制作。

【实验设备】

安装Android Studio的电脑一台,同时安装模拟器或者Android手机真机一台,保证网络畅通。

二、实验内容:

【实验内容】

    1. 实现底部导航功能,包括Tween动画、Frame动画、音频播放、视频播放四个按键。
    2. 实现动画功能,其中Tween动画可在界面选择四种类型的动画效果。
    3. 实现音频播放。
    4. 实现视频播放。

    【实验过程】

    底部导航实现过程按如下实例:

    1.主要布局文件activity_main.xml


    <?xml version="0" encoding="utf-8"?>
    
        <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    
        xmlns:tools="http://schemas.android.com/tools"
    
        android:layout_width="match_parent"
    
        android:layout_height="match_parent"
    
        tools:context="edu.zstu.multipage.MainActivity">
    
        <!--容器,用来操作Fragment的增加替换等-->
    
        <FrameLayout
    
            android:id="@+id/fragment_container"
    
            android:layout_width="match_parent"
    
            android:layout_height="match_parent"/>
    
        <!--底部菜单栏-->
    
        <LinearLayout
    
            android:layout_width="match_parent"
    
            android:layout_height="70dp"
    
            android:orientation="horizontal"
    
            android:background="@android:color/darker_gray"
    
            android:layout_alignParentBottom="true"
    
            android:layout_alignParentLeft="true"
    
            android:layout_alignParentStart="true">
    
            <LinearLayout
    
                android:layout_width="0dp"
    
                android:orientation="vertical"
    
                android:layout_height="match_parent"
    
                android:layout_weight="1">
    
                <ImageButton
    
                    android:id="@+id/home_btn"
    
                    android:layout_width="match_parent"
    
                    android:layout_height="wrap_content"
    
                    android:paddingTop="5dp"
    
                    android:src="@drawable/home_press"
    
                    android:background="@android:color/transparent" />


    <TextView       android:id="@+id/home_txt"
    
                    android:layout_width="match_parent"
    
                    android:layout_height="wrap_content"
    
                    android:text="主页"
    
                    android:textColor="@android:color/holo_red_dark"
    
                    android:gravity="center"/>
    
            </LinearLayout>
    
            <LinearLayout
    
                android:layout_width="0dp"
    
                android:orientation="vertical"
    
                android:layout_height="match_parent"
    
                android:layout_weight="1">
    
                <ImageButton
    
                    android:id="@+id/info_btn"
    
                    android:layout_width="match_parent"
    
                    android:layout_height="wrap_content"
    
                    android:paddingTop="5dp"
    
                    android:src="@drawable/info"
    
                    android:background="@android:color/transparent"/>
    
                <TextView
    
                    android:id="@+id/info_txt"
    
                    android:layout_width="match_parent"
    
                    android:layout_height="wrap_content"
    
                    android:text="消息"
    
                    android:textColor="@android:color/black"
    
                    android:gravity="center" />
    
            </LinearLayout>
    
        </LinearLayout>
    
    </RelativeLayout>

    2.第一Fragment和第二个Fragment:fragment_first.xml(为例)


    <?xml version="1.0" encoding="utf-8"?>
    
        <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    
        android:orientation="vertical"
    
        android:layout_width="match_parent"
    
        android:layout_height="match_parent">
    
        <TextView
    
            android:layout_width="match_parent"
    
            android:layout_height="match_parent"
    
            android:text="FirstPage"
    
            android:textSize="24sp"
    
            android:gravity="center|center"/>
    
    </LinearLayout>

    3. MainActivity

    3.1声明部分

    ImageButton homeBtn,infoBtn;


    TextView homeTxt,infoTxt;


    Context mContext;


    FragmentTransaction transaction;

    3.2 初始化

    mContext = this;


    homeBtn = (ImageButton)findViewById(R.id.home_btn);


    infoBtn = (ImageButton)findViewById(R.id.info_btn);


    homeTxt = (TextView)findViewById(R.id.home_txt);


    infoTxt = (TextView)findViewById(R.id.info_txt);


    //取得Fragment管理器


    Fragment firstFragment = new FirstFragment();


    transaction =getSupportFragmentManager().beginTransaction();


    //默认下将firstFragment添加到容器中


    transaction.add(R.id.fragment_container,firstFragment);


    //提交事务


    transaction.commit();

    3.3按钮点击(实现其中一个按钮,另一个按钮参照完成)

    //背景替换


    infoBtn.setImageResource(R.drawable.info);


    infoTxt.setTextColor(ContextCompat


           .getColor(mContext,android.R.color.black));


    homeBtn.setImageResource(R.drawable.home_press);


    homeTxt.setTextColor(ContextCompat


           .getColor(mContext,android.R.color.holo_red_dark));


    //取得Fragment管理器


    Fragment firstFragment = new FirstFragment();


    //将新建的firstFragment替换容器中的其他片段,这将重新加载布局文件。


    transaction =getSupportFragmentManager().beginTransaction();


    transaction.replace(R.id.fragment_container,firstFragment);

    transaction.commit();

    3.4 FirstFragment .java(SecondFragment类同)

    public class FirstFragment extends Fragment {

       @Override

       public View onCreateView(LayoutInflater inflater, ViewGroup container,

                                Bundle savedInstanceState) {

           View v = inflater.inflate(R.layout.fragment_first,null);

           return v;

       }

    }

    4.运行结果

    image.gif编辑

    有关底部导航的多种实现方法可参看https://blog.csdn.net/jxq1994/article/details/52573506?utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7Edefault-10.control&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7Edefault-10.control

    按实验要求分别实现Tween动画、Frame动画、音频播放和视频播放四个导航键的功能。

    三、实验结果测试完整所有代码在资源下载压缩包中,文章结尾有资源下载链接)

    共5个java文件和5个相对应的xml布局文件,其中还有一些资源文件。

    image.gif编辑

    主要的java代码:

    //MainActivity.java
    package com.example.a6;
    import android.Manifest;
    import android.app.Activity;
    import android.content.Context;
    import android.content.pm.PackageManager;
    import android.os.Bundle;
    import android.view.View;
    import android.widget.ImageButton;
    import android.widget.TextView;
    import android.widget.Toast;
    import androidx.appcompat.app.AppCompatActivity;
    import androidx.core.app.ActivityCompat;
    import androidx.core.content.ContextCompat;
    import androidx.fragment.app.FragmentTransaction;
    public class MainActivity extends AppCompatActivity {
        //澹版槑
        ImageButton homeBtn,infoBtn,musicBtn,videoBtn;
        TextView homeTxt,infoTxt,musicTxt,videoTxt;
        Context mContext;
        FragmentTransaction transaction;
        private static final int REQUEST_EXTERNAL_STORAGE = 1;
        private static String[] PERMISSIONS_STORAGE = {
                Manifest.permission.READ_EXTERNAL_STORAGE,
                Manifest.permission.WRITE_EXTERNAL_STORAGE
        };
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            //鍒濆鍖�
            init();
            verifyStoragePermissions(this);
            homeBtn.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    //鑳屾櫙鏇挎崲
                    infoBtn.setImageResource(R.drawable.info);
                    infoTxt.setTextColor(ContextCompat
                            .getColor(mContext,android.R.color.black));
                    musicBtn.setImageResource(R.drawable.music1);
                    musicTxt.setTextColor(ContextCompat
                            .getColor(mContext,android.R.color.black));
                    videoBtn.setImageResource(R.drawable.video1);
                    videoTxt.setTextColor(ContextCompat
                            .getColor(mContext,android.R.color.black));
                    homeBtn.setImageResource(R.drawable.home_press);
                    homeTxt.setTextColor(ContextCompat
                            .getColor(mContext,android.R.color.holo_red_dark));
    //鍙栧緱Fragment绠$悊鍣�
                    Fragment_First firstFragment = new Fragment_First();
    //灏嗘柊寤虹殑firstFragment鏇挎崲瀹瑰櫒涓殑鍏朵粬鐗囨锛岃繖灏嗛噸鏂板姞杞藉竷灞�鏂囦欢銆�
                    transaction =getSupportFragmentManager().beginTransaction();
                    transaction.replace(R.id.fragment_container,firstFragment);
                    transaction.commit();
                }
            });
            infoBtn.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    //鑳屾櫙鏇挎崲
                    infoBtn.setImageResource(R.drawable.info_press);
                    infoTxt.setTextColor(ContextCompat
                            .getColor(mContext,android.R.color.holo_red_dark));
                    homeBtn.setImageResource(R.drawable.home);
                    homeTxt.setTextColor(ContextCompat
                            .getColor(mContext,android.R.color.black));
                    musicBtn.setImageResource(R.drawable.music1);
                    musicTxt.setTextColor(ContextCompat
                            .getColor(mContext,android.R.color.black));
                    videoBtn.setImageResource(R.drawable.video1);
                    videoTxt.setTextColor(ContextCompat
                            .getColor(mContext,android.R.color.black));
    //鍙栧緱Fragment绠$悊鍣�
                    Fragment_Second secondFragment = new Fragment_Second();
    //灏嗘柊寤虹殑firstFragment鏇挎崲瀹瑰櫒涓殑鍏朵粬鐗囨锛岃繖灏嗛噸鏂板姞杞藉竷灞�鏂囦欢銆�
                    transaction =getSupportFragmentManager().beginTransaction();
                    transaction.replace(R.id.fragment_container,secondFragment);
                    transaction.commit();
                }
            });
            musicBtn.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    infoBtn.setImageResource(R.drawable.info);
                    infoTxt.setTextColor(ContextCompat
                            .getColor(mContext,android.R.color.black));
                    homeBtn.setImageResource(R.drawable.home);
                    homeTxt.setTextColor(ContextCompat
                            .getColor(mContext,android.R.color.black));
                    musicBtn.setImageResource(R.drawable.music2);
                    musicTxt.setTextColor(ContextCompat
                            .getColor(mContext,android.R.color.holo_red_dark));
                    videoBtn.setImageResource(R.drawable.video1);
                    videoTxt.setTextColor(ContextCompat
                            .getColor(mContext,android.R.color.black));
                    Fragment_Third ThirFragment=new Fragment_Third();
                    transaction =getSupportFragmentManager().beginTransaction();
                    transaction.replace(R.id.fragment_container,ThirFragment);
                    transaction.commit();
                }
            });
            videoBtn.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    infoBtn.setImageResource(R.drawable.info);
                    infoTxt.setTextColor(ContextCompat
                            .getColor(mContext,android.R.color.black));
                    homeBtn.setImageResource(R.drawable.home);
                    homeTxt.setTextColor(ContextCompat
                            .getColor(mContext,android.R.color.black));
                    musicBtn.setImageResource(R.drawable.music1);
                    musicTxt.setTextColor(ContextCompat
                            .getColor(mContext,android.R.color.black));
                    videoBtn.setImageResource(R.drawable.video2);
                    videoTxt.setTextColor(ContextCompat
                            .getColor(mContext,android.R.color.holo_blue_dark));
                    Fragment_Fourth FourthFragment=new Fragment_Fourth();
                    transaction =getSupportFragmentManager().beginTransaction();
                    transaction.replace(R.id.fragment_container,FourthFragment);
                    transaction.commit();
                }
            });
        }
        public static void verifyStoragePermissions(Activity activity) {
            // Check if we have write permission
            int permission = ActivityCompat.checkSelfPermission(activity, Manifest.permission.WRITE_EXTERNAL_STORAGE);
            if (permission != PackageManager.PERMISSION_GRANTED) {
                // We don't have permission so prompt the user
                ActivityCompat.requestPermissions(activity, PERMISSIONS_STORAGE, REQUEST_EXTERNAL_STORAGE);
            }
        }
        private void init() {
            mContext = this;
            homeBtn = (ImageButton)findViewById(R.id.home_btn);
            infoBtn = (ImageButton)findViewById(R.id.info_btn);
            homeTxt = (TextView)findViewById(R.id.home_txt);
            infoTxt = (TextView)findViewById(R.id.info_txt);
            musicBtn=(ImageButton) findViewById(R.id.musicBtn);
            musicTxt=(TextView)findViewById(R.id.musicTxt);
            videoBtn=(ImageButton)findViewById(R.id.videoBtn);
            videoTxt=(TextView)findViewById(R.id.videoTxt);
    //鍙栧緱Fragment绠$悊鍣�
            Fragment_First firstFragment = new Fragment_First();
            transaction =getSupportFragmentManager().beginTransaction();
    //榛樿涓嬪皢firstFragment娣诲姞鍒板鍣ㄤ腑
            transaction.add(R.id.fragment_container,firstFragment);
    //鎻愪氦浜嬪姟
            transaction.commit();
        }
    }

    image.gif

    //Fragment_First.java
    package com.example.a6;
    import android.app.Activity;
    import android.content.Context;
    import android.content.Intent;
    import android.media.Image;
    import android.os.Bundle;
    import android.util.Log;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;
    import android.view.animation.AlphaAnimation;
    import android.view.animation.Animation;
    import android.view.animation.AnimationSet;
    import android.view.animation.AnimationUtils;
    import android.view.animation.RotateAnimation;
    import android.view.animation.ScaleAnimation;
    import android.view.animation.TranslateAnimation;
    import android.widget.AdapterView;
    import android.widget.Button;
    import android.widget.ImageView;
    import android.widget.ListAdapter;
    import android.widget.ListView;
    import android.widget.SimpleAdapter;
    import android.widget.TextView;
    import android.widget.Toast;
    import androidx.annotation.Nullable;
    import androidx.fragment.app.Fragment;
    import androidx.fragment.app.FragmentActivity;
    import java.util.ArrayList;
    import java.util.HashMap;
    import java.util.List;
    public class Fragment_First extends Fragment  {
        private ImageView image;
        Animation anim;
       // Context mContext;
        private Button rotate,translate,alpha,scale;
        private Context context;
        @Override
        public void onCreate(@Nullable Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            this.context=getActivity();
        }
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                                 Bundle savedInstanceState) {
            View view = inflater.inflate(R.layout.fragment_first,container,false);
            image=(ImageView) view.findViewById(R.id.tween);
            rotate=(Button) view.findViewById(R.id.rotate);
            translate=(Button) view.findViewById(R.id.translate);
            alpha=(Button) view.findViewById(R.id.alpha);
            scale=(Button) view.findViewById(R.id.scale);
            setClickListener();
            Animation animation = new RotateAnimation(0, 180, Animation.RELATIVE_TO_SELF, 0.5f,
                    Animation.RELATIVE_TO_SELF, 0.5f);
            animation.setDuration(5000);
            image.setAnimation(animation);
            return view;
        }
        private void setClickListener() {
            rotate.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    anim = new RotateAnimation(0, 360, Animation.RELATIVE_TO_SELF, 0.5f,
                            Animation.RELATIVE_TO_SELF, 0.5f);
                    anim.setDuration(5000);
    //该方法用于设置一个动画效果执行完毕后,View对象保留在终止的位置
      /*              animation.setFillAfter(true);*/
                    image.startAnimation(anim);
                    Toast.makeText(context, "旋转", Toast.LENGTH_SHORT).show();
                }
            });
            alpha.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    AlphaAnimation alphaAnimation = new AlphaAnimation(0.0f, 1.0f);
                    alphaAnimation.setDuration(3000);
                    AnimationSet animationSet = new AnimationSet(false);
                    animationSet.addAnimation(alphaAnimation);
                    // 开始播放动画。
                    image.startAnimation(animationSet);
                    Toast.makeText(context, "透明", Toast.LENGTH_SHORT).show();
                }
            });
            scale.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    anim = new ScaleAnimation(0.0f, 1.2f, 0.0f, 1.2f, ScaleAnimation.RELATIVE_TO_SELF, 0.5f, ScaleAnimation.RELATIVE_TO_SELF, 0.5f);
                    anim.setDuration(2000);//所有属性可以通过set函数设置
                    image.startAnimation(anim);
                    Toast.makeText(context, "缩放", Toast.LENGTH_SHORT).show();
                }
            });
            translate.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    anim = new TranslateAnimation(0.0f, 1200f, 0f, 0f);
                    anim.setDuration(2000);
                    image.startAnimation(anim);
                    Toast.makeText(context, "移动", Toast.LENGTH_SHORT).show();
                }
            });
        }
    }

    image.gif

    //Fragment_Second.java
    package com.example.a6;
    import android.app.Activity;
    import android.graphics.drawable.AnimationDrawable;
    import android.graphics.drawable.Drawable;
    import android.os.Bundle;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;
    import android.widget.Button;
    import android.widget.ImageView;
    import androidx.annotation.Nullable;
    import androidx.appcompat.app.AppCompatActivity;
    import androidx.fragment.app.Fragment;
    public class Fragment_Second extends Fragment {
        private ImageView ivImage;
        private Button start,stop;
        private AnimationDrawable anim;
        @Override
        public void onCreate(@Nullable Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
        }
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                                 Bundle savedInstanceState) {
            View v = inflater.inflate(R.layout.fragment_second,null);
            ivImage = (ImageView) v.findViewById(R.id.frame_image);
            start=(Button) v.findViewById(R.id.startframe);
            stop=(Button) v.findViewById(R.id.stopframe);
            ivImage.setBackgroundResource(R.drawable.frame);
            anim = (AnimationDrawable) ivImage.getBackground();
            ivImage.post( new Runnable() {
                @Override
                public void run() {
                    anim.start();
                }
            });
            setClickListener();
            return v;
        }
        private void setClickListener() {
            stop.setOnClickListener( new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    anim.stop();
                }
            });
            start.setOnClickListener( new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    anim.start();
                }
            });
        }
    }

    image.gif

    //Fragment_Third.java
    package com.example.a6;
    import android.content.Context;
    import android.media.AudioManager;
    import android.media.MediaPlayer;
    import android.os.Bundle;
    import androidx.annotation.Nullable;
    import androidx.fragment.app.Fragment;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;
    import android.view.animation.Animation;
    import android.view.animation.RotateAnimation;
    import android.widget.Button;
    import android.widget.EditText;
    import android.widget.ImageView;
    import android.widget.Toast;
    import java.io.File;
    import java.io.IOException;
    public class Fragment_Third extends Fragment {
        private Button play,pause,stop,replay;
        private ImageView music;
        private MediaPlayer mediaPlayer;
        private Context context;
        Animation anim;
        @Override
        public void onCreate(@Nullable Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            context=getActivity();
        }
        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                                 Bundle savedInstanceState) {
            // Inflate the layout for this fragment
            View view = inflater.inflate(R.layout.fragment__third,container,false);
            play=(Button) view.findViewById(R.id.start);
            pause=(Button) view.findViewById(R.id.pause);
            replay=(Button) view.findViewById(R.id.replay);
            stop=(Button) view.findViewById(R.id.stop);
            music=(ImageView) view.findViewById(R.id.music3);
            play.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                        anim = new RotateAnimation(0, 3600, Animation.RELATIVE_TO_SELF, 0.5f,
                                Animation.RELATIVE_TO_SELF, 0.5f);
                        anim.setDuration(50000);
                        anim.setFillAfter(true);
                        music.startAnimation(anim);
                    mediaPlayer = new MediaPlayer();
                    try {
                        mediaPlayer.setDataSource("/sdcard/Music/love.mp3");
                        mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
                        mediaPlayer.prepareAsync();
                        mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
                            @Override
                            public void onPrepared(MediaPlayer mp) {
                                mediaPlayer.start();
                                Toast.makeText(context, "开始播放", Toast.LENGTH_SHORT).show();
                                play.setEnabled(false);
                            }
                        });
                        mediaPlayer.setLooping(true);
                        mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
                            @Override
                            public void onCompletion(MediaPlayer mp) {
                                play.setEnabled(true);
                            }
                        });
                        mediaPlayer.setOnErrorListener(new MediaPlayer.OnErrorListener() {
                            @Override
                            public boolean onError(MediaPlayer mp, int what, int extra) {
                                if(mediaPlayer!=null&&mediaPlayer.isPlaying()){
                                    mediaPlayer.seekTo(0);
                                    Toast.makeText(context, "重新播放", Toast.LENGTH_SHORT).show();
                                    pause.setText("暂停");
                                    //return;
                                }
                                return false;
                            }
                        });
                    } catch (IOException e) {
                        e.printStackTrace();
                        Toast.makeText(context, "播放失败", Toast.LENGTH_SHORT).show();
                    }
                }
            });
            replay.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    if(mediaPlayer!=null&&mediaPlayer.isPlaying()){
                        mediaPlayer.seekTo(0);
                        Toast.makeText(context, "重新播放", Toast.LENGTH_SHORT).show();
                        pause.setText("暂停");
                        //return;
                    }
                }
            });
            pause.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    if(pause.getText().toString().trim().equals("继续")){
                        pause.setText("暂停");
                        mediaPlayer.start();
                        Toast.makeText(context, "继续播放", Toast.LENGTH_SHORT).show();
                        // return;
                    }else if(mediaPlayer!=null&&mediaPlayer.isPlaying()){
                        mediaPlayer.pause();
                        pause.setText("继续");
                        Toast.makeText(context, "暂停播放", Toast.LENGTH_SHORT).show();
                    }
                }
            });
            stop.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    if(mediaPlayer!=null&&mediaPlayer.isPlaying()){
                        mediaPlayer.stop();
                        mediaPlayer.release();
                        mediaPlayer=null;
                        play.setEnabled(true);
                        Toast.makeText(context, "停止播放", Toast.LENGTH_SHORT).show();
                    }
                }
            });
            return view;
        }
        private void setOnclick() {
        }
        public void onDestroy() {
            if(mediaPlayer!=null&&mediaPlayer.isPlaying()){
                mediaPlayer.stop();
                mediaPlayer.release();
                mediaPlayer=null;
            }
            super.onDestroy();
        }
    }

    image.gif

    //Fragment_Fourth.java
    package com.example.a6;
    import android.content.Context;
    import android.media.MediaPlayer;
    import android.os.Bundle;
    import androidx.annotation.Nullable;
    import androidx.fragment.app.Fragment;
    import android.view.LayoutInflater;
    import android.view.SurfaceView;
    import android.view.View;
    import android.view.ViewGroup;
    import android.widget.ImageButton;
    import android.widget.SeekBar;
    import android.widget.TextView;
    import java.io.IOException;
    public class Fragment_Fourth extends Fragment {
        private MediaPlayer mediaPlayer;
        private SurfaceView sv_main_surface;
        private TextView tv_start;
        private TextView tv_end;
        private SeekBar seekbar;
        private Context context;
        private ImageButton play;
        @Override
        public void onCreate(@Nullable Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            context=getActivity();
        }
        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                                 Bundle savedInstanceState) {
            // Inflate the layout for this fragment
            View view = inflater.inflate(R.layout.fragment__fourth,container,false);
            sv_main_surface = (SurfaceView) view.findViewById(R.id.sv_main_surface);
            tv_start = (TextView)view.findViewById(R.id.tv_start);
            tv_end = (TextView)view. findViewById(R.id.tv_end);
            seekbar = (SeekBar) view.findViewById(R.id.seekbar);
            play=(ImageButton)view.findViewById(R.id.bt_media);
            //设置监听
            seekbar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
                @Override
                public void onProgressChanged(SeekBar seekBar, int i, boolean b) {
                    //获取音乐总时间
                    int duration2=mediaPlayer.getDuration()/1000;
                    //获取音乐当前播放的位置
                    int position=mediaPlayer.getCurrentPosition();
                    //开始时间
                    tv_start.setText(calculateTime(position/1000));
                    //结束时间
                    tv_end.setText(calculateTime(duration2));
                }
                @Override
                public void onStartTrackingTouch(SeekBar seekBar) {
                }
                @Override
                public void onStopTrackingTouch(SeekBar seekBar) {
                    int progress=seekBar.getProgress();
                    //在当前位置播放
                    mediaPlayer.seekTo(progress);
                }
            });
            play.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    //判断音频文件是否为空
                    if(mediaPlayer==null){
                        //为空则创建音乐文件并播放改变按钮样式
                        //播放内存卡中文件
                        mediaPlayer=new MediaPlayer();
                        try {
                            mediaPlayer.setDataSource("/sdcard/Movies/猫和老鼠.mp4");
                            //准备
                            mediaPlayer.prepare();
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                        //将媒体播放器捕捉的画面展示到SurfaceView
                        mediaPlayer.setDisplay(sv_main_surface.getHolder());
                        //开始播放
                        mediaPlayer.start();
                        //设置button
                        play.setImageResource(android.R.drawable.ic_media_pause);
                        //获取音乐总时间
                        int duration=mediaPlayer.getDuration();
                        //将音乐总时间设置为SeekBar的最大值
                        seekbar.setMax(duration);
                        //线程修改时间值
                        new MyThread().start();
                        //音乐文件正在播放,则暂停并改变按钮样式
                    }else if(mediaPlayer.isPlaying()){
                        mediaPlayer.pause();
                        play.setImageResource(android.R.drawable.ic_media_play);
                    }else{
                        //启动播放
                        mediaPlayer.start();
                        play.setImageResource(android.R.drawable.ic_media_pause);
                    }
                }
            });
            return view;
        }
        public void isPlayOrPause(View view){
        }
        class MyThread extends Thread{
            @Override
            public void run() {
                super.run();
                while(seekbar.getProgress()<=seekbar.getMax()){
                    //获取音乐当前播放的位置
                    int position=mediaPlayer.getCurrentPosition();
                    //放入SeekBar中
                    seekbar.setProgress(position);
                }
            }
        }
        //计算播放时间
        public String calculateTime(int time){
            int minute;
            int second;
            if(time>=60){
                minute=time/60;
                second=time%60;
                return minute+":"+second;
            }else if(time<60){
                second=time;
                return "0:"+second;
            }
            return null;
        }
    }

    image.gif

    实验结果截图:

    image.gif编辑image.gif编辑image.gif编辑

    image.gif编辑image.gif编辑image.gif编辑

    image.gif编辑image.gif编辑

    心得与体会:

    本次实验,学习了Fragment的用法以及学会Tween四种alpha,translate,rotate,scale动画、Frame逐帧动画和音频播放,视频播放等。通过此次实验,学习到的知识颇多,对android的开发有了进一步的学习。

    下载资源包链接:

    https://download.csdn.net/download/weixin_48388330/76309689

    资源中的图片以及内容只适用与学习

    相关文章
    |
    7月前
    |
    安全 搜索推荐 Android开发
    Android安全性: 解释HTTPS在移动应用中的重要性。
    Android安全性: 解释HTTPS在移动应用中的重要性。
    83 0
    |
    4月前
    |
    IDE 开发工具 Android开发
    安卓与iOS开发环境对比:选择哪个平台开始你的移动应用之旅?
    【8月更文挑战第12天】在移动应用开发的世界中,安卓和iOS是两个巨头,它们各自拥有独特的开发环境和生态系统。本文将深入探讨这两个平台的开发环境,包括它们的编程语言、工具、社区支持和市场覆盖度等方面。无论你是新手开发者还是有经验的专业人士,了解这些差异都将帮助你做出更明智的决策,选择最适合你项目需求和个人技能的平台。
    49 1
    |
    2月前
    |
    开发工具 Android开发 iOS开发
    Android vs iOS:构建移动应用时的关键考量####
    本文深入探讨了Android与iOS两大移动平台在开发环境、性能优化、用户体验设计及市场策略方面的差异性,旨在为开发者提供决策依据。通过对比分析,揭示两个平台各自的优势与挑战,帮助开发者根据项目需求做出更明智的选择。 ####
    |
    4月前
    |
    Java 物联网 Android开发
    移动应用与系统:技术演进与未来展望探索安卓应用开发:从新手到专家的旅程
    【8月更文挑战第28天】本文将深入探讨移动应用开发的技术演进、移动操作系统的发展历程以及未来的发展趋势。我们将通过实例和代码示例,展示如何利用最新的技术和工具来开发高效、可靠的移动应用。无论你是初学者还是经验丰富的开发者,这篇文章都将为你提供有价值的信息和见解。 【8月更文挑战第28天】在这个数字时代,掌握安卓应用的开发技能不仅是技术人员的追求,也成为了许多人实现创意和梦想的途径。本文将通过深入浅出的方式,带领读者从零基础开始,一步步走进安卓开发的奇妙世界。我们将探讨如何配置开发环境,理解安卓应用的核心组件,以及如何通过实际编码来构建一个功能完整的应用。无论你是编程新手还是希望提升自己的开发者
    |
    4月前
    |
    Android开发 iOS开发 C#
    Xamarin:用C#打造跨平台移动应用的终极利器——从零开始构建你的第一个iOS与Android通用App,体验前所未有的高效与便捷开发之旅
    【8月更文挑战第31天】Xamarin 是一个强大的框架,允许开发者使用单一的 C# 代码库构建高性能的原生移动应用,支持 iOS、Android 和 Windows 平台。作为微软的一部分,Xamarin 充分利用了 .NET 框架的强大功能,提供了丰富的 API 和工具集,简化了跨平台移动应用开发。本文通过一个简单的示例应用介绍了如何使用 Xamarin.Forms 快速创建跨平台应用,包括设置开发环境、定义用户界面和实现按钮点击事件处理逻辑。这个示例展示了 Xamarin.Forms 的基本功能,帮助开发者提高开发效率并实现一致的用户体验。
    157 0
    |
    4月前
    |
    Android开发 iOS开发 C#
    Xamarin.Forms:从零开始的快速入门指南——打造你的首个跨平台移动应用,轻松学会用C#和XAML构建iOS与Android通用界面的每一个步骤
    【8月更文挑战第31天】Xamarin.Forms 是一个强大的框架,让开发者通过单一共享代码库构建跨平台移动应用,支持 iOS、Android 和 Windows。使用 C# 和 XAML,它简化了多平台开发流程并保持一致的用户体验。本指南通过创建一个简单的 “HelloXamarin” 应用演示了 Xamarin.Forms 的基本功能和工作原理。
    92 0
    |
    4月前
    |
    安全 Android开发 iOS开发
    安卓与iOS开发之道:探索移动应用的差异化策略
    【8月更文挑战第21天】在移动应用开发的广阔天地中,安卓和iOS这两大操作系统平台各领风骚。本文将深入探讨这两个平台的差异化策略,帮助开发者理解如何根据不同平台的特性优化应用设计,提升用户体验,并最大化市场潜力。我们将从用户界面、性能优化、市场定位、安全性以及发布策略等多个维度进行比较分析,旨在为开发者提供一个全面的视角,以便在竞争激烈的应用市场中占据一席之地。
    |
    7月前
    |
    缓存 Android开发 iOS开发
    打造高效移动应用:Android与iOS性能优化策略
    【4月更文挑战第29天】 在移动设备日益成为用户日常互动的主要平台的今天,应用程序的性能已成为决定其成功的关键因素之一。本文将探讨针对Android和iOS平台的性能优化技巧,涵盖内存管理、多线程处理、网络请求优化以及用户界面的流畅性提升等方面。通过分析不同操作系统的架构特点,我们旨在提供一套综合性的策略,帮助开发者构建快速、响应迅捷且用户体验良好的应用。
    |
    7月前
    |
    存储 人工智能 安全
    移动应用与系统:探索开发与操作系统的融合安卓应用开发:打造高效用户界面的关键技术
    【5月更文挑战第27天】 随着移动互联网的飞速发展,移动应用和操作系统已经成为了我们日常生活中不可或缺的一部分。本文将深入探讨移动应用开发的关键要素,以及移动操作系统的核心功能。我们将分析移动应用开发的挑战和机遇,并讨论移动操作系统如何适应不断变化的技术环境。通过深入研究这些主题,我们希望为读者提供对移动应用和系统领域的全面理解。
    |
    7月前
    |
    XML 存储 Java
    安卓应用开发入门:构建您的第一个移动应用
    【4月更文挑战第13天】本文引导读者入门安卓应用开发,首先介绍设置开发环境,包括安装JDK和Android Studio。接着,通过Android Studio创建第一个项目,解析项目结构,重点讲解`AndroidManifest.xml`和`activity_main.xml`。然后,设计一个显示&quot;Hello World!&quot;的布局,并在`MainActivity.java`中编写相应逻辑。最后,运行并调试应用,鼓励读者继续学习安卓开发的更多知识,提升技能。
    84 6