1、團隊成員java
李釗 1600802047 162 https://www.cnblogs.com/18LZblog/android
2、apk連接git
https://pan.baidu.com/s/1foSVwC8cirUeDVdWme4CRQ數據庫
3、coding連接app
https://git.coding.net/LZ18009788462/android_final.gitless
4、項目介紹ide
4.1整體效果截圖函數
4.2錄屏演示佈局
4.2.1內置視頻連接優化
https://pan.baidu.com/s/1pzOFSHrC68p1MI_JVdqFQg
4.3實現的功能及其效果描述
首先用fragment弄了5的page,能夠支持五個頁面左右滑動查看。
第一頁即首頁,頂部使用輪播圖展現了一些球員的照片,下面緊接着的是當下的時事新聞,點擊相應的新聞能夠查看具體內容。
第二頁展現了最新的球員世界排名
第三頁是部分球員的詳細介紹
第四頁列出了2019年乒乓球的賽事賽程
第五頁是精彩集錦,點擊能夠查看相關的視頻。
5、關鍵代碼
一、實現左右頁面滑屏的函數
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; } } }
二、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; } }
三、用viewflipper進行圖片的輪播
private ViewFlipper vflp_help; vflp_help = (ViewFlipper) view.findViewById(R.id.vflp); vflp_help.setFlipInterval(3000); vflp_help.startFlipping();
四、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 ; } }
五、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; }
六、視頻播放——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; } } }
6、運行其餘團隊項目的apk,團隊討論,選出你心目中的前5名,並簡單說明一下。
一、蓋星辰組
該組作個了一個很是有趣的小遊戲,隨着生活壓力的增大,該小遊戲很好的知足了人們的需求,消遣了人們的無聊時光。
優勢:首先點擊進去,首頁很是光鮮亮麗,給人以視覺上的衝擊。也很符合一個小遊戲的基本頁面。點擊開始,音樂的出現給遊戲帶來的一點躍動感。設置功能很好的知足了不一樣人羣的需求,設置了不一樣難度關卡和不一樣的任務選擇。整體來講還不錯,界面佈局十分美觀。
缺點:在進行操做的時候有些困難,有時候人物不聽使喚,左右控制不是很靈敏,致使玩高難度關卡的時候出現問題。
若是我來作的話可能會針對以上缺點對用戶的操做進行修正,是用戶上手體驗更好。
二、孟凡錨組
該小組作了一個簡易的音樂播放器,能夠獲取手機內置的音樂進行播放,並實現了暫停,上一首,下一首的功能。
優勢:首頁進去,插入了一個MV,頗有新意,背景也頗有視覺效應。進去之後,最上面是一個圖片輪播器,展現了一些專輯的封面,有QQ音樂網易雲音樂等APP的風格。點擊歌曲播放的時候用粉紅色標明,一目瞭然,讓用戶清楚的知道本身當前播放的音樂。
缺點:可能頁面佈局稍稍有一些欠缺(不一樣人有不一樣的審美吧!),還有就是在個人手機上運行的時候,沒法顯示下方的進度條以及上一首下一按鈕,體驗有一點差。
若是我來作的話,主要仍是對頁面佈局進行優化,而後在針對不一樣機型的顯示進行優化,以知足大部分以至全部安卓用戶。
三、湯文濤組
該組作了一個校園二手交易的APP,知足了當代大學生的一些需求,給大學生們提供了一個很好的平臺。
優勢:登陸註冊界面知足了一個APP的基本需求,鏈接了數據庫。進入界面之後便一目瞭然的能夠查看到不一樣想要的交易的信息,上面還能夠選擇不一樣的商品類型,很好的知足了用需求。交易商品的下方能夠進行評論留言,有很好的互動以及對商品的充分了解。我的中心弄的也很好,能夠查看本身發佈的內容以及更改密碼等。整體還不錯。
缺點:頁面能夠更加美觀,其中的電子產品等都尚未實現,能夠將這些數據所有寫入數據庫,方便操做和後期的管理。
若是我來作,可能將頁面優化,利用Fragment和Viewpager來佈局,讓頁面更加靈活而不是單純的跳轉。讓後鏈接數據庫對商品詳情進行管理。
四、甦醒組
該組作了一個簡易的音樂播放器,實現了音樂的播放功能,上一首下一首還有音量調節。
優勢:直接獲取到了用戶手機內置的音樂。實現了音量的調節,想的很全面。
缺點:頁面佈局有些簡略,感受沒有音樂APP的優美感。
針對他的問題,我認爲可能最重要的仍是對界面美觀進行優化,對listview列表採起跳轉的方式,進入到播放頁面,而後利用圖片的旋轉,下方佈置進度條,及存放組件。這樣可能用戶的體驗感會更好。
五、石俊浩組
該組作了一個簡易的音樂播放器,實現了音樂播放的功能,上一首下一首。
優勢:進入APP時有一個進入動畫,很新穎。而後音樂播放的時候有圖片輪轉,畫面比較美觀。
缺點:只能獲取開發者(他本身)手機裏面的音樂,而沒法獲取用戶手機裏面的音樂。沒有進度條,用戶沒法清楚的知道當前音樂播放的位置。
針對以上的缺點,我認爲能夠借鑑一下其餘組的優勢,直接獲取用戶手機裏面的音樂,而後再實現一個進度條的功能可能就比較完善了。
7、實現過程當中遇到的問題及解決方法。
一、使用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>
二、使用listview的時候定義List<ArrayList>(),數據沒法現實,即運行的時候沒有顯示列表信息。
解決方法:換了另一個List。使用了List<Map<String , Object>>,用map來存放相關的信息。
三、視頻播放的時候系統老是提示」很抱歉沒法播放該視頻「。
解決方法:在安卓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" />
8、分工
姓名 | 分工 | 工做比例 | 分數 |
李釗 | 全部 | 100% | 10 |