• android第四次作业


    一、团队成员

    李钊  1600802047 162 https://www.cnblogs.com/18LZblog/

    二、apk链接

     https://pan.baidu.com/s/1foSVwC8cirUeDVdWme4CRQ

    三、coding链接

    https://git.coding.net/LZ18009788462/android_final.git

    四、项目介绍

    4.1总体效果截图

         

        

        

     

    4.2录屏演示

    4.2.1内置视频链接

     https://pan.baidu.com/s/1pzOFSHrC68p1MI_JVdqFQg

    4.3实现的功能及其效果描述

    首先用fragment弄了5的page,可以支持五个页面左右滑动查看。

    第一页即首页,顶部使用轮播图展示了一些球员的照片,下面紧接着的是当下的时事新闻,点击相应的新闻可以查看具体内容。

    第二页展示了最新的球员世界排名

    第三页是部分球员的详细介绍

    第四页列出了2019年乒乓球的赛事赛程

    第五页是精彩集锦,点击可以查看相关的视频。

    五、关键代码

    1、实现左右页面滑屏的函数

        public void onPageScrollStateChanged(int state) {
            //state的状态有三个,0表示什么都没做,1正在滑动,2滑动完毕
            if (state == 2) {
                switch (vpager.getCurrentItem()) {
                    case PAGE_ONE:
                        first_page.setChecked(true);
                        break;
                    case PAGE_TWO:
                        ranking.setChecked(true);
                        break;
                    case PAGE_THREE:
                        players_data.setChecked(true);
                        break;
                    case PAGE_FOUR:
                        schedule.setChecked(true);
                        break;
                    case PAGE_FIVE:
                        highlights.setChecked(true);
                        break;
                }
            }
        }

    2、fragment适配器,在mainactivity中使用

    package com.example.hp.android_final;
    
    import android.support.v4.app.Fragment;
    import android.support.v4.app.FragmentManager;
    import android.support.v4.app.FragmentPagerAdapter;
    import android.view.ViewGroup;
    
    public class MyFragmentPagerAdapter extends FragmentPagerAdapter {
    
        private final int PAGER_COUNT = 5;
        private MyFragment myFragment1 = null;
        private MyFragment2 myFragment2 = null;
        private MyFragment3 myFragment3 = null;
        private MyFragment4 myFragment4 = null;
        private MyFragment5 myFragment5 = null;
    
    
        public MyFragmentPagerAdapter(FragmentManager fm) {
            super(fm);
            myFragment1 = new MyFragment();
            myFragment2 = new MyFragment2();
            myFragment3 = new MyFragment3();
            myFragment4 = new MyFragment4();
            myFragment5 = new MyFragment5();
        }
    
    
        @Override
        public int getCount() {
            return PAGER_COUNT;
        }
    
        @Override
        public Object instantiateItem(ViewGroup vg, int position) {
            return super.instantiateItem(vg, position);
        }
    
        @Override
        public void destroyItem(ViewGroup container, int position, Object object) {
            System.out.println("position Destory" + position);
            super.destroyItem(container, position, object);
        }
    
        @Override
        public Fragment getItem(int position) {
            Fragment fragment = null;
            switch (position) {
                case MainActivity.PAGE_ONE:
                    fragment = myFragment1;
                    break;
                case MainActivity.PAGE_TWO:
                    fragment = myFragment2;
                    break;
                case MainActivity.PAGE_THREE:
                    fragment = myFragment3;
                    break;
                case MainActivity.PAGE_FOUR:
                    fragment = myFragment4;
                    break;
                case MainActivity.PAGE_FIVE:
                    fragment = myFragment5;
                    break;
            }
            return fragment;
        }
    
    }

    3、用viewflipper进行图片的轮播

     private ViewFlipper vflp_help;
            vflp_help = (ViewFlipper) view.findViewById(R.id.vflp);
            vflp_help.setFlipInterval(3000);
            vflp_help.startFlipping();

    4、listview适配器

    package com.example.hp.android_final;
    
    import android.content.Context;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;
    import android.widget.ArrayAdapter;
    import android.widget.BaseAdapter;
    import android.widget.ImageView;
    import android.widget.TextView;
    
    import java.util.List;
    import java.util.Map;
    
    public class NewsAdapter extends BaseAdapter {
    private List<Map<String , Object>> data ;
    private LayoutInflater layoutInflater ;
    private Context context ;
    public NewsAdapter(Context context , List<Map<String , Object>> data ){
        this.context = context ;
        this.data = data ;
        this.layoutInflater = LayoutInflater.from(context);
    }
    
    public final class News{
        public ImageView image ;
        public TextView title ;
        public TextView content ;
    }
    public int getCount(){
        return data.size();
    }
    public Object getItem(int position){
            return data.get(position);
        }
        public long getItemId(int position){
            return position ;
        }
        public View getView(int position , View convertView , ViewGroup parent){
        News ns = null;
        if (convertView == null) {
            ns = new News();
            convertView = layoutInflater.inflate(R.layout.news_item ,null);
            ns.image = (ImageView)convertView.findViewById(R.id.image);
            ns.title = (TextView)convertView.findViewById(R.id.title);
            ns.content = (TextView)convertView.findViewById(R.id.content);
            convertView.setTag(ns);
        }else{
            ns = (News)convertView.getTag();
            }
            ns.image.setBackgroundResource((Integer)data.get(position).get("image"));
            ns.title.setText((String)data.get(position).get("title"));
            ns.content.setText((String)data.get(position).get("content"));
        return convertView ;
        }
     }

    5、listview点击响应

            listview.setOnItemClickListener(new AdapterView.OnItemClickListener() {
                @Override
                public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                            Intent intent = null ;
                            switch(position){
                                case 0 :
                                    intent = new Intent(parent.getContext(),Main2Activity.class);
                                    break;
                                case 1 :
                                    intent = new Intent(parent.getContext(),Main7Activity.class);
                                    break;
                                case 2 :
                                    intent = new Intent(parent.getContext(),Main8Activity.class);
                                    break;
                            }
                            startActivity(intent);
                    }
            });
            return view;
        }

    6、视频播放——activity

    package com.example.hp.android_final;
    
    import android.Manifest;
    import android.content.pm.PackageManager;
    import android.os.Environment;
    import android.support.v4.app.ActivityCompat;
    import android.support.v4.content.ContextCompat;
    import android.support.v7.app.AppCompatActivity;
    import android.os.Bundle;
    import android.view.View;
    import android.widget.Button;
    import android.widget.MediaController;
    import android.widget.VideoView;
    
    public class Main3Activity extends AppCompatActivity implements View.OnClickListener {
        private VideoView videoView;
        private Button btn_start;
        private Button btn_pause;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main3);
            bindViews();
            if (ContextCompat.checkSelfPermission(Main3Activity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
                ActivityCompat.requestPermissions(Main3Activity.this, new String[]{
                        Manifest.permission.WRITE_EXTERNAL_STORAGE}, 1);
            }
        }
        private void bindViews() {
            videoView = (VideoView) findViewById(R.id.videoView);
            btn_start = (Button) findViewById(R.id.btn_start);
            btn_pause = (Button) findViewById(R.id.btn_pause);
    
    
            btn_start.setOnClickListener(this);
            btn_pause.setOnClickListener(this);
    
    
            //根据文件路径播放
            if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
                videoView.setVideoPath(Environment.getExternalStorageDirectory() + "/vedio_a.mp4");
            }
    
            //读取放在raw目录下的文件
            //videoView.setVideoURI(Uri.parse("android.resource://com.jay.videoviewdemo/" + R.raw.lesson));
            videoView.setMediaController(new MediaController(this));
        }
    
        @Override
        public void onClick(View v) {
            switch (v.getId()) {
                case R.id.btn_start:
                    videoView.start();
                    break;
                case R.id.btn_pause:
                    videoView.pause();
                    break;
    
        }
        }
    }

     六、运行其他团队项目的apk,团队讨论,选出你心目中的前5名,并简单说明一下。

    1、盖星辰组

    该组做个了一个非常有趣的小游戏,随着生活压力的增大,该小游戏很好的满足了人们的需求,消遣了人们的无聊时光。

    优点:首先点击进去,首页非常光鲜亮丽,给人以视觉上的冲击。也很符合一个小游戏的基本页面。点击开始,音乐的出现给游戏带来的一点跃动感。设置功能很好的满足了不同人群的需求,设置了不同难度关卡和不同的任务选择。总体来说还不错,界面布局十分美观。

    缺点:在进行操作的时候有些困难,有时候人物不听使唤,左右控制不是很灵敏,导致玩高难度关卡的时候出现问题。

    如果我来做的话可能会针对以上缺点对用户的操作进行修正,是用户上手体验更好。

    2、孟凡锚组

    该小组做了一个简易的音乐播放器,可以获取手机内置的音乐进行播放,并实现了暂停,上一首,下一首的功能。

    优点:首页进去,插入了一个MV,很有新意,背景也很有视觉效应。进去以后,最上面是一个图片轮播器,展示了一些专辑的封面,有QQ音乐网易云音乐等APP的风格。点击歌曲播放的时候用粉红色标明,一目了然,让用户清楚的知道自己当前播放的音乐。

    缺点:可能页面布局稍稍有一些欠缺(不同人有不同的审美吧!),还有就是在我的手机上运行的时候,无法显示下方的进度条以及上一首下一按钮,体验有一点差。

    如果我来做的话,主要还是对页面布局进行优化,然后在针对不同机型的显示进行优化,以满足大部分以致所有安卓用户。

    3、汤文涛组

    该组做了一个校园二手交易的APP,满足了当代大学生的一些需求,给大学生们提供了一个很好的平台。

    优点:登录注册界面满足了一个APP的基本需求,连接了数据库。进入界面以后便一目了然的可以查看到不同想要的交易的信息,上面还可以选择不同的商品类型,很好的满足了用需求。交易商品的下方可以进行评论留言,有很好的互动以及对商品的充分了解。个人中心弄的也很好,可以查看自己发布的内容以及更改密码等。总体还不错。

    缺点:页面可以更加美观,其中的电子产品等都还没有实现,可以将这些数据全部写入数据库,方便操作和后期的管理。

    如果我来做,可能将页面优化,利用Fragment和Viewpager来布局,让页面更加灵活而不是单纯的跳转。让后连接数据库对商品详情进行管理。

    4、苏醒组

    该组做了一个简易的音乐播放器,实现了音乐的播放功能,上一首下一首还有音量调节。

    优点:直接获取到了用户手机内置的音乐。实现了音量的调节,想的很全面。

    缺点:页面布局有些简略,感觉没有音乐APP的优美感。

    针对他的问题,我认为可能最重要的还是对界面美观进行优化,对listview列表采取跳转的方式,进入到播放页面,然后利用图片的旋转,下方布置进度条,及存放组件。这样可能用户的体验感会更好。

    5、石俊浩组

    该组做了一个简易的音乐播放器,实现了音乐播放的功能,上一首下一首。

    优点:进入APP时有一个进入动画,很新颖。然后音乐播放的时候有图片轮转,画面比较美观。

    缺点:只能获取开发者(他自己)手机里面的音乐,而无法获取用户手机里面的音乐。没有进度条,用户无法清楚的知道当前音乐播放的位置。

    针对以上的缺点,我认为可以借鉴一下其他组的优点,直接获取用户手机里面的音乐,然后再实现一个进度条的功能可能就比较完善了。

    七、实现过程中遇到的问题及解决方法。

    1、使用viewflipper进行图片轮播的时候无动画效果。

    解决方法:在网上查阅后,新加了两个xml文件来实现动画。

    <?xml version="1.0" encoding="utf-8"?>
    <set xmlns:android="http://schemas.android.com/apk/res/android">
    
        <translate
            android:duration="2000"
            android:fromXDelta="100%p"
            android:toXDelta="0" />
    
    </set>
    <?xml version="1.0" encoding="utf-8"?>
    <set xmlns:android="http://schemas.android.com/apk/res/android" >
    
        <translate
            android:duration="2000"
            android:fromXDelta="0"
            android:toXDelta="-100%p" />
    
    </set>

    2、使用listview的时候定义List<ArrayList>(),数据无法现实,即运行的时候没有显示列表信息。

    解决方法:换了另外一个List。使用了List<Map<String , Object>>,用map来存放相关的信息。

    3、视频播放的时候系统总是提示”很抱歉无法播放该视频“。

    解决方法:在安卓6.0以上是要赋予权限的,出现以上问题是由于没有赋予权限。

           if (ContextCompat.checkSelfPermission(Main3Activity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
                ActivityCompat.requestPermissions(Main3Activity.this, new String[]{
                        Manifest.permission.WRITE_EXTERNAL_STORAGE}, 1);
            }

    然后在manifest中在赋予权限

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

    八、分工

    姓名 分工 工作比例 分数
    李钊 所有 100% 10
    
    
    
  • 相关阅读:
    C++ 类或函数导出lib的两种方式
    Qt 中文乱码原因以及解决方法
    AStyle Clion中配置代码格式化工具(附:博主最满意格式)
    nltk中meteor_score的计算,报错
    Ubuntu20重装nvidia驱动
    No input file specified,php+Nginx,报错处理
    「cocos2dx」动画创建笔记
    「cocos2dx」物理引擎学习之box2D(1)
    golang_listen3_time
    face_to_face
  • 原文地址:https://www.cnblogs.com/18LZblog/p/10205321.html
Copyright © 2020-2023  润新知