立項依據(jù)(項目背景及研究現(xiàn)狀500字以內(nèi))
???通過網(wǎng)上問卷等形式做了前期調(diào)研,網(wǎng)上問卷由問卷星提供技術(shù)支持,共有348份答卷,問卷鏈接為很抱歉,此問卷(12931895)已暫停,不能填寫!。
(1)通過調(diào)查發(fā)現(xiàn):79%的學(xué)生認為通過APP做題強化預(yù)習(xí)效果是比較有效的一種預(yù)習(xí)方式,并對此表示贊成;
(2)通過走訪調(diào)查及和實驗課老師交流發(fā)現(xiàn),實驗教材的更新速度跟不上實驗儀器更新的速度,對同學(xué)的學(xué)習(xí)造成了一定影響;
(3)調(diào)查發(fā)現(xiàn),70%的學(xué)生在課堂看老師實驗操作演示時只能記住部分內(nèi)容,90%的學(xué)生認為把老師錄制的實驗操作視頻上傳到APP對他們有幫助。所以可以嘗試在APP上增加視頻教學(xué)模塊,用于上傳實驗操作類、課外延伸類等教學(xué)視頻,幫助這些學(xué)生順利地完成實驗;
(4)調(diào)查顯示,89%學(xué)生都支持APP提供數(shù)據(jù)表格,95%的學(xué)生支持增加數(shù)據(jù)智能處理及時反饋功能。他們評價說,該功能可以改變以往報告交上去后不能及時知道結(jié)果對錯的情況,幫助他們更好的發(fā)現(xiàn)問題和出錯的地方,使自己不斷進步。
? 對于這些長期困擾物理實驗課程教學(xué)的問題以及大多數(shù)同學(xué)的期望,有望通過引入現(xiàn)代信息技術(shù),深化物理實驗課程教學(xué)模式的改革,以移動學(xué)習(xí)技術(shù)輔助大學(xué)物理實驗課程教學(xué)等方法逐步解決。
項目內(nèi)容、研究方法、創(chuàng)新點、預(yù)期成果(2000字以內(nèi))
一、項目內(nèi)容:基于遼寧科技大學(xué)大物實驗實際教學(xué)情況和調(diào)查問卷的統(tǒng)計結(jié)果,開發(fā)一款能夠在學(xué)習(xí)、評價、教學(xué)、網(wǎng)絡(luò)基礎(chǔ)設(shè)施和教育生產(chǎn)力等方面發(fā)揮輔助作用的教育類APP,以及結(jié)合本校的實際運營效果探索出教育類APP的較好的實踐模式。具體開發(fā)內(nèi)容主要包括以下幾個方面:
(1)UI和原型設(shè)計。
(2)app功能開發(fā)和服務(wù)器開發(fā)。
(3)app后臺管理系統(tǒng)開發(fā)。
(4)app測試。
(5)app主流應(yīng)用平臺上架。
(6)app運營和維護,整理資料并發(fā)表研究論文。
- 研究方法:(1)調(diào)查法。初期已通過網(wǎng)上問卷等形式調(diào)查了遼寧科技大學(xué)學(xué)生們對大物實驗這種教育類APP的觀點、態(tài)度、建議及功能需求等相關(guān)情況,然后用統(tǒng)計分析的數(shù)據(jù)指導(dǎo)實際的開發(fā)過程,這樣以大多數(shù)同學(xué)的需求為導(dǎo)向,開發(fā)出來的軟件更有實用價值。軟件測試、運營、迭代等階段也會通過問卷、走訪等形式進行調(diào)查。
通過Axure工具進行UI和原型設(shè)計。通過Android studio和Xcode開發(fā)相應(yīng)版本的APP功能。使用rudy開發(fā)后臺管理系統(tǒng)。結(jié)合整個開發(fā)實例發(fā)表研究論文。
三、創(chuàng)新點:(1)通過教育類APP探索新的預(yù)習(xí)模式。嘗試改變以前只寫預(yù)習(xí)報告的單一預(yù)習(xí)模式,在APP中增添預(yù)習(xí)資料和相應(yīng)的練習(xí)題,強化預(yù)習(xí)效果。
(2)通過教育類APP整合教學(xué)資源。在APP上有機地整合大物實驗各種資料,并通過發(fā)布老師教學(xué)所用的實驗課件等資源來創(chuàng)造性地解決實驗課本的更新速度跟不上實驗儀器更新的速度的問題。
(3)依托教育類APP的線上線下相結(jié)合學(xué)習(xí)和教學(xué)模式的創(chuàng)新。嘗試通過APP和課堂這種有創(chuàng)造性的線上線下相結(jié)合的學(xué)習(xí)和教學(xué)模式,推進教育事業(yè)更快更好向前發(fā)展。這也無疑是互聯(lián)網(wǎng)加教育的偉大創(chuàng)新,對其他任何學(xué)科的教改都有很大的借鑒價值。
(4)通過教育類APP探索成績考核的新模式。嘗試改變傳統(tǒng)的以實驗報告為主體的考核模式,在APP上增加做練習(xí)題、測試題、觀看操作視頻等多元的考核方式,全面考核同學(xué)們的學(xué)習(xí)效果和學(xué)習(xí)能力,為培養(yǎng)綜合性、創(chuàng)新性人才奠定了基礎(chǔ)。
四、預(yù)期成果:(1)實現(xiàn)APP使用學(xué)號進行登錄的功能。
(2)實現(xiàn)APP做練習(xí)題的功能。
(3)實現(xiàn)APP做限時測試的功能。
(4)實現(xiàn)在APP上發(fā)布教學(xué)所用的實驗課件等資源的功能
(5)實現(xiàn)APP視頻教學(xué)模塊。
(6)實現(xiàn)在APP上提供數(shù)據(jù)表格和自助數(shù)據(jù)處理功能。
(7)在主流應(yīng)用平臺上架所開發(fā)的APP。
(8)APP用戶數(shù)超過1500人。
(9)整理相關(guān)資料數(shù)據(jù),總結(jié)教育類APP的研究和實踐過程,并發(fā)表研究論文。
第一階段(2017年4月),確定APP設(shè)計方案。
2、第二階段(2017年5~6月),UI和原型設(shè)計。
3、第三階段(2017年7~9月),app功能開發(fā)和構(gòu)建服務(wù)器。
4、第四階段(2017年10~11月),app后臺管理系統(tǒng)開發(fā)。
5、第五階段(2018年12月),app測試。
6、第六階段(2018年1月),app主流應(yīng)用平臺上架。
7、第七階段(2018年2~3月),app運營和維護,整理資料并發(fā)表研究論文
總費用預(yù)計為15000元,明細如下:?
? 1.?資料費3000元:包括書籍、軟件、打印費用等?
???2.?應(yīng)用開發(fā)費10000元:包括存儲資料用移動硬盤、構(gòu)建服務(wù)器等費用。 ????????????????
???3.?版面費2000元:用于發(fā)表論文。
項目指導(dǎo)教師意見 使用APP輔助大學(xué)物理實驗教學(xué),可以使物理實驗課程教學(xué)更加多樣化,有效的加強了學(xué)生對大學(xué)物理實驗的理解和學(xué)習(xí)。這種讓互聯(lián)網(wǎng)與傳統(tǒng)教學(xué)模式進行深度融合的學(xué)習(xí)模式,充分發(fā)揮學(xué)習(xí)內(nèi)容微型化、學(xué)習(xí)終端靈活化的優(yōu)勢,實現(xiàn)高校學(xué)生按需學(xué)習(xí)、高效學(xué)習(xí)和快樂學(xué)習(xí)的理想,可使參與學(xué)生的自主學(xué)習(xí)能力有明顯的提高,同時也讓教師真正做到因材施教,給學(xué)生更大的學(xué)習(xí)空間,彌補了實驗課程教學(xué)時間不足的問題。 通過學(xué)生參與開發(fā),有利于培養(yǎng)學(xué)生綜合運用多學(xué)科知識解決實際問題能力,提高創(chuàng)新意識和創(chuàng)新能力,開發(fā)學(xué)生潛能、調(diào)動學(xué)生學(xué)習(xí)積極性。 故而推薦該大創(chuàng)項目。? |
部分開發(fā)筆記(draft)
目錄
部分開發(fā)筆記(draft) 1
一、注冊與登錄 1
1.1注冊界面布局 1
1.2注冊功能代碼 5
1.3登錄界面布局 7
1.4登錄功能代碼 11
二、 主界面(消息、實驗、我) 13
2.1主界面布局及效果圖 13
2.2主界面代碼 18
三、課件、視頻、題庫 29
2.3課件布局及效果圖 29
2.4課件功能代碼 30
2.5視頻模塊效果圖 31
2.6視頻模塊代碼 31
2.7題庫界面布局 31
2.8 從相冊或拍照選擇頭像并裁剪成方形代碼 33
2.9數(shù)據(jù)處理模塊效果圖 36
四、其他 36
2.8應(yīng)用于題庫的手勢滑動切題的Demo代碼 3639一、注冊與登錄
1.1注冊界面布局
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:id="@+id/activity_register"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"tools:context="com.xy.classspace.Register"><android.support.v7.widget.Toolbarandroid:id="@+id/toolbar"android:layout_width="match_parent"android:layout_height="40dp"android:background="?attr/colorPrimary"><!--添加Toolbar的子控件--><TextViewandroid:id="@+id/tv_title"android:layout_width="wrap_content"android:layout_height="match_parent"android:layout_gravity="center"android:gravity="center"android:text="注冊"android:textColor="#FFFFFF"android:textSize="20sp" /></android.support.v7.widget.Toolbar><LinearLayoutandroid:orientation="vertical"android:layout_width="match_parent"android:layout_height="match_parent"><RelativeLayoutandroid:layout_width="match_parent"android:layout_height="70dp"><FrameLayoutandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_alignParentTop="true"android:padding="4dp"android:layout_alignParentEnd="false"android:layout_alignParentRight="false"tools:layout_alignBottom="@+id/et_login_phone"android:paddingTop="10dp"android:id="@+id/frameLayout3"><ImageViewandroid:layout_width="match_parent"android:layout_height="match_parent"android:src="@android:drawable/ic_menu_myplaces"android:id="@+id/user_id_icon"android:layout_gravity="bottom"/></FrameLayout><EditTextandroid:layout_width="match_parent"android:layout_height="match_parent"android:ems="10"android:id="@+id/user_id"tools:layout_height="wrap_content"tools:layout_toRightOf="@+id/frameLayout"tools:layout_width="wrap_content"android:layout_centerVertical="true"android:layout_alignParentRight="true"android:layout_alignParentEnd="true"android:layout_alignParentLeft="true"android:layout_alignParentStart="true" /></RelativeLayout><RelativeLayoutandroid:layout_width="match_parent"android:layout_height="70dp"><FrameLayoutandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_alignParentTop="true"android:padding="4dp"android:layout_alignParentEnd="false"android:layout_alignParentRight="false"tools:layout_alignBottom="@+id/et_login_phone"android:paddingTop="10dp"android:background="@android:drawable/ic_lock_lock"android:id="@+id/frameLayout2"><ImageViewandroid:layout_width="match_parent"android:layout_height="match_parent"android:src="@android:drawable/ic_lock_lock"android:id="@+id/user_pass_icon"android:layout_gravity="bottom"/></FrameLayout><EditTextandroid:layout_width="match_parent"android:layout_height="match_parent"android:inputType="textPassword"android:ems="10"android:id="@+id/user_pass"tools:layout_height="wrap_content"tools:layout_toRightOf="@+id/frameLayout"tools:layout_width="wrap_content"android:layout_centerVertical="true"android:layout_alignParentRight="true"android:layout_alignParentEnd="true"android:layout_alignParentLeft="true"android:layout_alignParentStart="true" /></RelativeLayout><Buttonandroid:layout_marginTop="10dp"android:text="注冊"android:layout_width="match_parent"android:layout_height="wrap_content"android:id="@+id/register_button" /></LinearLayout>
</LinearLayout>1.2注冊功能代碼
注冊并將賬號和密碼上傳到服務(wù)器的代碼:
package com.xy.classspace;import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;import cn.bmob.v3.BmobUser;
import cn.bmob.v3.exception.BmobException;
import cn.bmob.v3.listener.SaveListener;public class Register extends AppCompatActivity {public EditText username,password;private SharedPreferences preferences;private SharedPreferences.Editor editor;
private Toolbar mToolbar;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_register);setTitle("");mToolbar= (Toolbar) findViewById(R.id.toolbar);setSupportActionBar(mToolbar);getSupportActionBar().setDisplayHomeAsUpEnabled(true);mToolbar.setNavigationOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {finish();}});preferences=getSharedPreferences("lkdwlsyxz1",MODE_PRIVATE);editor=preferences.edit();Button register= (Button) findViewById(R.id.register_button);username= (EditText) this.findViewById(R.id.user_id);password = (EditText)this.findViewById(R.id.user_pass);/* register.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {Toast.makeText(Register.this,"用戶名密碼不能為空",Toast.LENGTH_SHORT).show();}});*/register.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {if(username.getText().toString().trim().length()==0||password.getText().toString().trim().length()==0){Toast.makeText(getApplicationContext(),"用戶名密碼不能為空",Toast.LENGTH_SHORT).show();}else{BmobUser bu = new BmobUser();bu.setUsername(username.getText().toString());bu.setPassword(password.getText().toString());// bu.setEmail("sendi@163.com");
//注意:不能用save方法進行注冊bu.signUp(new SaveListener<MyUser>() {@Overridepublic void done(MyUser s, BmobException e) {if(e==null){// toast("注冊成功:" +s.toString());editor.putString("user_id",username.getText().toString());editor.putString("user_pass",password.getText().toString());editor.commit();Toast.makeText(getApplicationContext(),"注冊成功",Toast.LENGTH_LONG).show();Intent intent=new Intent(Register.this,LoginActivity.class);startActivity(intent);}else{Toast.makeText(getApplicationContext(),"用戶名已存在",Toast.LENGTH_LONG).show();}}});}}});}
}1.3登錄界面布局
1、登錄界面布局:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:id="@+id/activity_main"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"tools:context="com.xy.classspace.LoginActivity"><android.support.v7.widget.Toolbarandroid:id="@+id/toolbar"android:layout_width="match_parent"android:layout_height="40dp"android:background="?attr/colorPrimary"><!--添加Toolbar的子控件--><Buttonandroid:id="@+id/btn_register"android:layout_width="60dp"android:layout_height="wrap_content"android:layout_gravity="right"android:background="@color/colorPrimary"android:text="注冊"android:textColor="#faf7f7"android:textSize="11sp" /><TextViewandroid:id="@+id/tv_title"android:layout_width="wrap_content"android:layout_height="match_parent"android:layout_gravity="center"android:gravity="center"android:text="登錄"android:textColor="#FFFFFF"android:textSize="20sp" /></android.support.v7.widget.Toolbar><LinearLayoutandroid:orientation="vertical"android:layout_width="match_parent"android:layout_height="match_parent"android:layout_alignParentTop="true"android:layout_alignParentLeft="true"android:layout_alignParentStart="true"><RelativeLayoutandroid:layout_width="match_parent"android:layout_height="70dp"tools:background="@android:color/background_light"><FrameLayoutandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_alignParentTop="true"android:padding="4dp"android:layout_alignParentEnd="false"android:layout_alignParentRight="false"tools:layout_alignBottom="@+id/et_login_phone"android:paddingTop="10dp"android:id="@+id/frameLayout3"><ImageViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"app:srcCompat="@android:drawable/ic_menu_myplaces"android:id="@+id/user_id_icon"android:layout_gravity="bottom"/></FrameLayout><EditTextandroid:layout_width="match_parent"android:layout_height="match_parent"android:ems="10"android:id="@+id/user_id"tools:layout_height="wrap_content"tools:layout_toRightOf="@+id/frameLayout"tools:layout_width="wrap_content"android:layout_alignBottom="@+id/frameLayout3"android:layout_alignParentRight="true"android:layout_alignParentEnd="true"android:layout_toRightOf="@+id/frameLayout3"android:layout_toEndOf="@+id/frameLayout3" /></RelativeLayout><RelativeLayoutandroid:layout_width="match_parent"android:layout_height="70dp"><FrameLayoutandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_alignParentTop="true"android:padding="4dp"android:layout_alignParentEnd="false"android:layout_alignParentRight="false"tools:layout_alignBottom="@+id/et_login_phone"android:paddingTop="10dp"android:id="@+id/frameLayout2"><ImageViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:src="@android:drawable/ic_lock_lock"android:id="@+id/user_pass_icon"android:layout_gravity="bottom"/></FrameLayout><EditTextandroid:layout_width="match_parent"android:layout_height="match_parent"android:inputType="textPassword"android:ems="10"android:id="@+id/user_pass"tools:layout_height="wrap_content"tools:layout_toRightOf="@+id/frameLayout"tools:layout_width="wrap_content"android:layout_alignBottom="@+id/frameLayout2"android:layout_alignParentRight="true"android:layout_alignParentEnd="true"android:layout_toRightOf="@+id/frameLayout2"android:layout_toEndOf="@+id/frameLayout2" /></RelativeLayout><Buttonandroid:layout_marginTop="10dp"android:text="登錄"android:layout_width="match_parent"android:layout_height="wrap_content"android:id="@+id/login_button" /></LinearLayout>
</LinearLayout>1.4登錄功能代碼
從服務(wù)器獲取密碼比較并登錄的邏輯代碼:
public class LoginActivity extends AppCompatActivity {public EditText username,password;private SharedPreferences preferences;private SharedPreferences.Editor editor;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_login);Bmob.initialize(this, "44cda0a720e34234f77ed0d27214baaf");BmobUser bmobUser =BmobUser.getCurrentUser();if(bmobUser!=null){Intent intent=new Intent(LoginActivity.this,Main3Activity.class);startActivity(intent);finish();}Button login= (Button) findViewById(R.id.login_button);Button register= (Button) findViewById(R.id.btn_register);username= (EditText) this.findViewById(R.id.user_id);password = (EditText)this.findViewById(R.id.user_pass);preferences=getSharedPreferences("lkdwlsyxz1",MODE_PRIVATE);editor=preferences.edit();login.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {String user_id=preferences.getString("user_id",null);String user_pass=preferences.getString("user_pass",null);/* if((username.getText().toString().trim().equals(user_id)) && (password.getText().toString().trim().equals(user_pass))){Intent intent=new Intent(LoginActivity.this,Main3Activity.class);startActivity(intent);}else{Toast.makeText(LoginActivity.this,"用戶名或密碼錯誤",Toast.LENGTH_SHORT).show();}*/BmobUser bu2 = new BmobUser();bu2.setUsername(username.getText().toString());bu2.setPassword(password.getText().toString());bu2.login(new SaveListener<BmobUser>() {@Overridepublic void done(BmobUser bmobUser, BmobException e) {if(e==null){Toast.makeText(getApplicationContext(),"登錄成功:",Toast.LENGTH_LONG).show();//通過BmobUser user = BmobUser.getCurrentUser()獲取登錄成功后的本地用戶信息//如果是自定義用戶對象MyUser,可通過MyUser user = BmobUser.getCurrentUser(MyUser.class)獲取自定義用戶信息Intent intent=new Intent(LoginActivity.this,Main3Activity.class);startActivity(intent);}else{Toast.makeText(getApplicationContext(),e.getMessage(),Toast.LENGTH_LONG).show();}}});}});register.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {Intent intent=new Intent(LoginActivity.this,Register.class);startActivity(intent);}});}
}二、主界面(消息、實驗、我)
2.1主界面布局及效果圖2、主界面布局代碼:
<?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"><LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"><TextViewandroid:layout_width="match_parent"android:layout_height="wrap_content"android:background="#7EC0EE"android:paddingLeft="20dp"android:text="實驗教學(xué)"android:textColor="#F0FFF0"android:textSize="20dp"/></LinearLayout><TabHostandroid:id="@android:id/tabhost"android:layout_width="match_parent"android:layout_height="match_parent"android:layout_weight="1"><!--引用android系統(tǒng)已有的id--><LinearLayoutandroid:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"><FrameLayoutandroid:id="@android:id/tabcontent"android:layout_width="match_parent"android:layout_height="match_parent"android:layout_weight="1"><!--消息頁面--><LinearLayoutandroid:id="@+id/tab01"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"><ListViewandroid:id="@+id/listviewMessage"android:layout_width="match_parent"android:layout_height="wrap_content"></ListView></LinearLayout><!-- 班級頁面--><LinearLayoutandroid:id="@+id/tab02"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"><ExpandableListViewandroid:id="@+id/listviewDWSY"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_marginTop="10dp"></ExpandableListView></LinearLayout><!-- 我的頁面--><LinearLayoutandroid:id="@+id/tab03"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"><LinearLayoutandroid:layout_width="fill_parent"android:layout_height="wrap_content"android:orientation="horizontal"><ImageViewandroid:id="@+id/touxiang"android:layout_width="60dp"android:layout_height="60dp"android:layout_marginLeft="18dp"android:layout_marginTop="10dp"android:src="@drawable/touxiang" /><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginLeft="15dp"android:paddingTop="25dp"android:text="Mr.yu"android:textSize="20sp" /></LinearLayout><Viewandroid:layout_width="match_parent"android:layout_height="1dp"android:background="#DEDEDE"></View><LinearLayoutandroid:layout_width="fill_parent"android:layout_height="wrap_content"android:orientation="horizontal"><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginLeft="10dp"android:padding="10dp"android:text="個性簽名"android:textSize="18sp" /><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:paddingTop="10dp"android:text="#2017#讓自己累一點"android:textSize="15sp"/></LinearLayout><LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:orientation="horizontal"><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginLeft="10dp"android:padding="10dp"android:text="學(xué)號"android:textSize="18sp" /><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:paddingTop="10dp"android:text="1201636036"android:textSize="20sp" /></LinearLayout><Viewandroid:layout_width="match_parent"android:layout_height="1dp"android:background="#DEDEDE"></View><ListViewandroid:id="@+id/listview_me"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_marginLeft="10dp"></ListView><Buttonandroid:id="@+id/button"android:layout_width="match_parent"android:layout_height="wrap_content"android:background="#7EC0EE"android:text="退出登錄"android:textColor="#F7F7F7" /></LinearLayout></FrameLayout><TabWidgetandroid:id="@android:id/tabs"android:layout_width="match_parent"android:layout_height="wrap_content"></TabWidget></LinearLayout></TabHost>
</LinearLayout>2.2主界面代碼
4.1、主界面功能邏輯代碼
package com.xy.classspace;import android.app.AlertDialog;
import android.app.TabActivity;
import android.content.DialogInterface;
import android.content.Intent;
import android.graphics.Bitmap;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.provider.MediaStore;
import android.util.Log;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseExpandableListAdapter;
import android.widget.Button;
import android.widget.ExpandableListView;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.SimpleAdapter;
import android.widget.TabHost;
import android.widget.TextView;
import android.widget.Toast;import java.io.File;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;/*import xiaocool.net.classspace.ClassAlbum.ClassAlbumActivity;
import xiaocool.net.classspace.ClassBlog.ClassBlogActivity;
import xiaocool.net.classspace.Homework.Homework;*//*** Created by MRYU on 2015/3/7.*/
public class Main3Activity extends TabActivity {private Button mAddImage;private Bitmap mBitmap;protected static final int CHOOSE_PICTURE = 0;protected static final int TAKE_PICTURE = 1;protected static Uri tempUri;private static final int CROP_SMALL_PICTURE = 2;private ImageView touxiang;private TabHost tabHost;// private ListView listViewMessage, listViewClass, listViewMe;private ListView listViewMessage,listViewMe;private ExpandableListView dwsy;/*** 消息界面數(shù)據(jù)*/private String titleMessage[] = {"李四", "張和", "吳曦", "劉偉"};private int[] head_iconMessage = new int[]{R.drawable.touxiang, R.drawable.touxiang,R.drawable.touxiang, R.drawable.touxiang};private String[] descMessage = new String[]{"消息功能開發(fā)中", "消息功能開發(fā)中","消息功能開發(fā)中", "消息功能開發(fā)中"};private String[] timeMessage = new String[]{"2017/5/7 17:56", "2017/5/16 17:56","2017/5/7 17:56", "2017/16 17:56"};/*** 實驗界面數(shù)據(jù)*/private String groups[] = {"霍爾效應(yīng)", "固體導(dǎo)熱系數(shù)", "表面張力","牛頓環(huán)", "油滴實驗", "干涉實驗", "熱電偶"};private String[][] childs={{"練習(xí)題","實驗課件","調(diào)試小視頻","數(shù)據(jù)處理"},{"練習(xí)題","實驗課件","調(diào)試小視頻","數(shù)據(jù)處理"},{"練習(xí)題","實驗課件","實驗操作視頻","數(shù)據(jù)處理"},{"練習(xí)題","實驗課件","實驗操作視頻","數(shù)據(jù)處理"},{"練習(xí)題","實驗課件","實驗操作視頻","數(shù)據(jù)處理"},{"練習(xí)題","實驗課件","實驗操作視頻","數(shù)據(jù)處理"},{"練習(xí)題","實驗課件","實驗操作視頻","數(shù)據(jù)處理"}};private int groupicons[] = new int[]{R.drawable.img_public_acc_head, R.drawable.img_class_roster_head, R.drawable.img_news_head,R.drawable.img_blog_head, R.drawable.img_video_head, R.drawable.img_album_head, R.drawable.img_home_work_head};private int[][] childicons={{R.mipmap.yuxi,R.mipmap.kj,R.mipmap.caozuo,R.mipmap.sjcl}};/*** 我的界面數(shù)據(jù)*/private String[] titleMe = new String[]{"清空聊天記錄", "檢查更新", "關(guān)于小站", "設(shè)置"};@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main3);touxiang= (ImageView) findViewById(R.id.touxiang);touxiang.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {showChoosePicDialog();}});listViewMessage = (ListView) this.findViewById(R.id.listviewMessage);dwsy = (ExpandableListView) this.findViewById(R.id.listviewDWSY);listViewMe = (ListView) this.findViewById(R.id.listview_me);//獲取tabhost組件TabHost tabHost=getTabHost();//創(chuàng)建第一個Tab頁TabHost.TabSpec tab1 = tabHost.newTabSpec("tab1").setIndicator("消息")//設(shè)置標(biāo)題.setContent(R.id.tab01);//添加第一個tab頁tabHost.addTab(tab1);TabHost.TabSpec tab2 = tabHost.newTabSpec("tab2").setIndicator("全部實驗")//設(shè)置標(biāo)題.setContent(R.id.tab02);//添加第一個tab頁tabHost.addTab(tab2);TabHost.TabSpec tab3 = tabHost.newTabSpec("tab3").setIndicator("我")//設(shè)置標(biāo)題.setContent(R.id.tab03);//添加第一個tab頁tabHost.addTab(tab3);/*** 我的界面*/List<Map<String, Object>> listitemsMe = new ArrayList<Map<String, Object>>();for (int i = 0; i < titleMe.length; i++) {Map<String, Object> listitemMe = new HashMap<String, Object>();listitemMe.put("title", titleMe[i]);listitemsMe.add(listitemMe);}//SimpleAdapter adapterMe = new SimpleAdapter(this, listitemsMe,R.layout.me_item,new String[]{"title"},new int[]{R.id.textview_me});listViewMe.setAdapter(adapterMe);/*** 填充我的消息界面*/List<Map<String, Object>> listitems = new ArrayList<Map<String, Object>>();for (int i = 0; i < titleMessage.length; i++) {Map<String, Object> listitem = new HashMap<String, Object>();listitem.put("title", titleMessage[i]);listitem.put("head_icon", head_iconMessage[i]);listitem.put("desc", descMessage[i]);listitem.put("time", timeMessage[i]);listitems.add(listitem);}SimpleAdapter adapterMessage = new SimpleAdapter(this, listitems,R.layout.message_item,new String[]{"title", "head_icon", "desc", "time"},new int[]{R.id.title, R.id.imageview_message, R.id.desc, R.id.time});listViewMessage.setAdapter(adapterMessage);/*** 填充班級界面*/dwsy.setAdapter(new MyExpandableListView());dwsy.setOnChildClickListener(new ExpandableListView.OnChildClickListener() {@Overridepublic boolean onChildClick(ExpandableListView parent, View v, int groupPosition, int childPosition, long id) {switch (groupPosition){case 0:switch (childPosition){case 1:Intent intent=new Intent(Main3Activity.this,WebView.class);startActivity(intent);break;case 2:Uri uri=Uri.parse("http://flashmedia.eastday.com/newdate/news/2016-11/shznews1125-19.mp4");Intent niurou=new Intent(Intent.ACTION_VIEW);niurou.setDataAndType(uri,"video/mp4");startActivity(niurou);break;default:Toast.makeText(getApplicationContext(),"研發(fā)中.....",Toast.LENGTH_SHORT).show();break;}break;case 1:switch (childPosition){case 1:Intent intent=new Intent(Main3Activity.this,WebView2.class);startActivity(intent);break;case 2:Uri uri=Uri.parse("http://112.253.22.157/17/z/z/y/u/zzyuasjwufnqerzvyxgkuigrkcatxr/hc.yinyuetai.com/D046015255134077DDB3ACA0D7E68D45.flv");Intent music=new Intent(Intent.ACTION_VIEW);// Log.v("URl-----------------",uri.toString());music.setDataAndType(uri,"video/mp4");startActivity(music);break;default:Toast.makeText(getApplicationContext(),"研發(fā)中.....",Toast.LENGTH_SHORT).show();break;}break;default:Toast.makeText(getApplicationContext(),"研發(fā)中.....",Toast.LENGTH_SHORT).show();break;}Toast.makeText(getApplicationContext(),"研發(fā)中.....",Toast.LENGTH_SHORT).show();return true;}});}/* private List<Map<String, Object>> getData(){List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();for (int i=0;i<groups.length;i++){Map<String,Object> map=new HashMap<String,Object>();map.put("title",groups[i]);map.put("img",groupicons[i]);list.add(map);}return list;}*///為ExpandableListView自定義適配器class MyExpandableListView extends BaseExpandableListAdapter {//返回一級列表的個數(shù)@Overridepublic int getGroupCount() {return groups.length;}//返回每個二級列表的個數(shù)@Overridepublic int getChildrenCount(int groupPosition) { //參數(shù)groupPosition表示第幾個一級列表// Log.d("smyhvae", "-->" + groupPosition);return childs[groupPosition].length;}//返回一級列表的單個item(返回的是對象)@Overridepublic Object getGroup(int groupPosition) {return groups[groupPosition];}//返回二級列表中的單個item(返回的是對象)@Overridepublic Object getChild(int groupPosition, int childPosition) {return childs[groupPosition][childPosition]; //不要誤寫成groups[groupPosition][childPosition]}@Overridepublic long getGroupId(int groupPosition) {return groupPosition;}@Overridepublic long getChildId(int groupPosition, int childPosition) {return childPosition;}//每個item的id是否是固定?一般為true@Overridepublic boolean hasStableIds() {return true;}//【重要】填充一級列表@Overridepublic View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) {if (convertView == null) {convertView = getLayoutInflater().inflate(R.layout.item_group, null);}ImageView iv_group = (ImageView) convertView.findViewById(R.id.iv_group);TextView tv_group = (TextView) convertView.findViewById(R.id.tv_group);iv_group.setImageResource(groupicons[groupPosition]);tv_group.setText(groups[groupPosition]);return convertView;}//【重要】填充二級列表@Overridepublic View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent) {if (convertView == null) {convertView = getLayoutInflater().inflate(R.layout.item_child, null);}ImageView iv_child = (ImageView) convertView.findViewById(R.id.iv_child);TextView tv_child = (TextView) convertView.findViewById(R.id.tv_child);iv_child.setImageResource(childicons[0][childPosition]);tv_child.setText(childs[groupPosition][childPosition]);return convertView;}//二級列表中的item是否能夠被選中?可以改為true@Overridepublic boolean isChildSelectable(int groupPosition, int childPosition) {return true;}}/*** 顯示修改圖片的對話框*/protected void showChoosePicDialog() {AlertDialog.Builder builder = new AlertDialog.Builder(Main3Activity.this);builder.setTitle("添加圖片");String[] items = { "選擇本地照片", "拍照" };builder.setNegativeButton("取消", null);builder.setItems(items, new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {switch (which) {case CHOOSE_PICTURE: // 選擇本地照片Intent openAlbumIntent = new Intent(Intent.ACTION_GET_CONTENT);openAlbumIntent.setType("image/*");//用startActivityForResult方法,待會兒重寫onActivityResult()方法,拿到圖片做裁剪操作startActivityForResult(openAlbumIntent, CHOOSE_PICTURE);break;case TAKE_PICTURE: // 拍照Intent openCameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);tempUri = Uri.fromFile(new File(Environment.getExternalStorageDirectory(), "temp_image.jpg"));// 將拍照所得的相片保存到SD卡根目錄openCameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, tempUri);startActivityForResult(openCameraIntent, TAKE_PICTURE);break;}}});builder.show();}@Overridepublic void onActivityResult(int requestCode, int resultCode, Intent data) {super.onActivityResult(requestCode, resultCode, data);if (resultCode == MainActivity.RESULT_OK) {switch (requestCode) {case TAKE_PICTURE:cutImage(tempUri); // 對圖片進行裁剪處理break;case CHOOSE_PICTURE:cutImage(data.getData()); // 對圖片進行裁剪處理break;case CROP_SMALL_PICTURE:if (data != null) {setImageToView(data); // 讓剛才選擇裁剪得到的圖片顯示在界面上}break;}}}/*** 裁剪圖片方法實現(xiàn)*/protected void cutImage(Uri uri) {if (uri == null) {Log.i("alanjet", "The uri is not exist.");}tempUri = uri;Intent intent = new Intent("com.android.camera.action.CROP");//com.android.camera.action.CROP這個action是用來裁剪圖片用的intent.setDataAndType(uri, "image/*");// 設(shè)置裁剪intent.putExtra("crop", "true");// aspectX aspectY 是寬高的比例intent.putExtra("aspectX", 1);intent.putExtra("aspectY", 1);// outputX outputY 是裁剪圖片寬高intent.putExtra("outputX", 150);intent.putExtra("outputY", 150);intent.putExtra("return-data", true);startActivityForResult(intent, CROP_SMALL_PICTURE);}/*** 保存裁剪之后的圖片數(shù)據(jù)*/protected void setImageToView(Intent data) {Bundle extras = data.getExtras();if (extras != null) {mBitmap = extras.getParcelable("data");//這里圖片是方形的,可以用一個工具類處理成圓形(很多頭像都是圓形,這種工具類網(wǎng)上很多不再詳述)touxiang.setImageBitmap(mBitmap);//顯示圖片//在這個地方可以寫上上傳該圖片到服務(wù)器的代碼,后期將單獨寫一篇這方面的博客,敬請期待...}}三、課件、視頻、題庫
2.3課件布局及效果圖<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:id="@+id/activity_web_view2"android:layout_width="match_parent"android:layout_height="match_parent"tools:context="com.xy.classspace.WebView2"><WebViewandroid:id="@+id/KJWV2"android:layout_width="match_parent"android:layout_height="match_parent"></WebView>
</RelativeLayout>2.4課件功能代碼
package com.xy.classspace;import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.webkit.WebChromeClient;
import android.webkit.WebSettings;public class WebView2 extends AppCompatActivity {private android.webkit.WebView wv;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_web_view2);wv= (android.webkit.WebView) findViewById(R.id.KJWV2);wv.getSettings().setJavaScriptEnabled(true);//wv.setScrollBarStyle(0);WebSettings webSettings = wv.getSettings();webSettings.setAllowFileAccess(true);webSettings.setBuiltInZoomControls(true);wv.loadUrl("http://c.xiumi.us/board/v5/2lT28/32041137");wv.setWebChromeClient(new WebChromeClient() {@Overridepublic void onProgressChanged(android.webkit.WebView view, int newProgress) {if (newProgress == 100) {WebView2.this.setTitle("固體導(dǎo)熱系數(shù)的測量");} else {WebView2.this.setTitle("加載中.......");}}});}
}2.5視頻模塊效果圖2.6視頻模塊代碼Uri uri=Uri.parse("http://112.253.22.157/17/z/z/y/u/zzyuasjwufnqerzvyxgkuigrkcatxr/hc.yinyuetai.com/D046015255134077DDB3ACA0D7E68D45.flv");Intent music=new Intent(Intent.ACTION_VIEW);
// Log.v("URl-----------------",uri.toString());music.setDataAndType(uri,"video/mp4");startActivity(music);2.7題庫界面布局
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:id="@+id/activity_huoer__tiku"android:layout_width="match_parent"android:layout_height="match_parent"android:paddingBottom="@dimen/activity_vertical_margin"android:paddingLeft="@dimen/activity_horizontal_margin"android:paddingRight="@dimen/activity_horizontal_margin"android:paddingTop="@dimen/activity_vertical_margin"tools:context="com.xy.classspace.HUOER_TIKU"><TextViewandroid:id="@+id/diyiti"android:text="第一題 負效應(yīng)有"android:textSize="20dp"android:layout_width="match_parent"android:layout_height="wrap_content" />
<RadioGroupandroid:layout_width="match_parent"android:layout_height="match_parent"><RadioButtonandroid:id="@+id/B"android:layout_width="match_parent"android:layout_height="141dp"android:text="BBBBB"/><RadioButtonandroid:id="@+id/A"android:layout_width="match_parent"android:layout_height="150dp"android:text="A AAAAA"/><RadioButtonandroid:id="@+id/C"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="CCCC"/><RadioButtonandroid:id="@+id/D"android:layout_width="match_parent"android:layout_height="90dp"android:text="DDDDD"/></RadioGroup>
</RelativeLayout>2.8 從相冊或拍照選擇頭像并裁剪成方形代碼
/*** 顯示修改圖片的對話框*/
protected void showChoosePicDialog() {AlertDialog.Builder builder = new AlertDialog.Builder(Main3Activity.this);builder.setTitle("添加圖片");String[] items = { "選擇本地照片", "拍照" };builder.setNegativeButton("取消", null);builder.setItems(items, new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {switch (which) {case CHOOSE_PICTURE: // 選擇本地照片Intent openAlbumIntent = new Intent(Intent.ACTION_GET_CONTENT);openAlbumIntent.setType("image/*");//用startActivityForResult方法,待會兒重寫onActivityResult()方法,拿到圖片做裁剪操作startActivityForResult(openAlbumIntent, CHOOSE_PICTURE);case TAKE_PI break;
CTURE: // 拍照Intent openCameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);tempUri = Uri.fromFile(new File(Environment.getExternalStorageDirectory(), "temp_image.jpg"));// 將拍照所得的相片保存到SD卡根目錄openCameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, tempUri);startActivityForResult(openCameraIntent, TAKE_PICTURE);break;}}});builder.show();
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {super.onActivityResult(requestCode, resultCode, data);if (resultCode == MainActivity.RESULT_OK) {switch (requestCode) {case TAKE_PICTURE:cutImage(tempUri); // 對圖片進行裁剪處理break;case CHOOSE_PICTURE:cutImage(data.getData()); // 對圖片進行裁剪處理break;case CROP_SMALL_PICTURE:if (data != null) {setImageToView(data); // 讓剛才選擇裁剪得到的圖片顯示在界面上}break;}}
}
/*** 裁剪圖片方法實現(xiàn)*/
protected void cutImage(Uri uri) {if (uri == null) {Log.i("alanjet", "The uri is not exist.");}tempUri = uri;Intent intent = new Intent("com.android.camera.action.CROP");//com.android.camera.action.CROP這個action是用來裁剪圖片用的intent.setDataAndType(uri, "image/*");// 設(shè)置裁剪intent.putExtra("crop", "true");// aspectX aspectY 是寬高的比例intent.putExtra("aspectX", 1);intent.putExtra("aspectY", 1);// outputX outputY 是裁剪圖片寬高intent.putExtra("outputX", 150);intent.putExtra("outputY", 150);intent.putExtra("return-data", true);startActivityForResult(intent, CROP_SMALL_PICTURE);
}
/*** 保存裁剪之后的圖片數(shù)據(jù)*/
protected void setImageToView(Intent data) {Bundle extras = data.getExtras();if (extras != null) {mBitmap = extras.getParcelable("data");//這里圖片是方形的,可以用一個工具類處理成圓形(很多頭像都是圓形,這種工具類網(wǎng)上很多不再詳述)touxiang.setImageBitmap(mBitmap);//顯示圖片//在這個地方可以寫上上傳該圖片到服務(wù)器的代碼,后期將單獨寫一篇這方面的博客,敬請期待...}
}2.9數(shù)據(jù)處理模塊效果圖四、其他
2.8應(yīng)用于題庫的手勢滑動切題的Demo代碼
所用知識點為Viewflipper和GestureDetectorpackage com.diabin.viewflipper;import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.GestureDetector;
import android.view.MotionEvent;
import android.widget.ViewFlipper;import static com.diabin.viewflipper.R.id.flipper;public class MainActivity extends AppCompatActivity {
private ViewFlipper viewFlipper;private GestureDetector mdetector;/*** Called when a touch screen event was not handled by any of the views* under it. This is most useful to process touch events that happen* outside of your window bounds, where there is no view to receive it.** @param event The touch screen event being processed.* @return Return true if you have consumed the event, false if you haven't.* The default implementation always returns false.*/@Overridepublic boolean onTouchEvent(MotionEvent event) {return mdetector.onTouchEvent(event);}@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);viewFlipper= (ViewFlipper) findViewById(flipper);mdetector=new GestureDetector(this, new GestureDetector.OnGestureListener() {@Overridepublic boolean onDown(MotionEvent e) {return false;}@Overridepublic void onShowPress(MotionEvent e) {}@Overridepublic boolean onSingleTapUp(MotionEvent e) {return false;}@Overridepublic boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {return false;}@Overridepublic void onLongPress(MotionEvent e) {}@Overridepublic boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {final float FLING_MIN_DISTANCE = 100;//最小滑動像素final float FLING_MIN_VELOCITY = 150;//最小滑動速度if(e1.getX() - e2.getX() > FLING_MIN_DISTANCE &&Math.abs(velocityX) > FLING_MIN_VELOCITY){//X軸上的移動速度去絕對值進行比較//判斷x軸坐標(biāo)如果第一次按下時的坐標(biāo)減去第二次離開屏幕時的坐標(biāo)大于我們設(shè)置的位移,因為一個控件的原點是在左上角,就說明此時是向左滑動的viewFlipper.showNext();//顯示下一個視圖}else if(e2.getX() - e1.getX() > FLING_MIN_DISTANCE &&Math.abs(velocityX) > FLING_MIN_VELOCITY){//判斷x軸坐標(biāo)如果第二次離開屏幕時的坐標(biāo)減去第一次按下時的坐標(biāo)大于我們設(shè)置的位移,因為一個控件的原點是在左上角,就說明此時是向右滑動的viewFlipper.showPrevious();//顯示上一個視圖}return true;}});}}未完待續(xù) 。。。。。。。。。。。
總結(jié)
以上是生活随笔為你收集整理的[省级大创项目]教育类APP的探索和实践——大学物理实验助手APP开发的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。