立項依據(項目背景及研究現狀500字以內)
???通過網上問卷等形式做了前期調研,網上問卷由問卷星提供技術支持,共有348份答卷,問卷鏈接為很抱歉,此問卷(12931895)已暫停,不能填寫!。
(1)通過調查發現:79%的學生認為通過APP做題強化預習效果是比較有效的一種預習方式,并對此表示贊成;
(2)通過走訪調查及和實驗課老師交流發現,實驗教材的更新速度跟不上實驗儀器更新的速度,對同學的學習造成了一定影響;
(3)調查發現,70%的學生在課堂看老師實驗操作演示時只能記住部分內容,90%的學生認為把老師錄制的實驗操作視頻上傳到APP對他們有幫助。所以可以嘗試在APP上增加視頻教學模塊,用于上傳實驗操作類、課外延伸類等教學視頻,幫助這些學生順利地完成實驗;
(4)調查顯示,89%學生都支持APP提供數據表格,95%的學生支持增加數據智能處理及時反饋功能。他們評價說,該功能可以改變以往報告交上去后不能及時知道結果對錯的情況,幫助他們更好的發現問題和出錯的地方,使自己不斷進步。
? 對于這些長期困擾物理實驗課程教學的問題以及大多數同學的期望,有望通過引入現代信息技術,深化物理實驗課程教學模式的改革,以移動學習技術輔助大學物理實驗課程教學等方法逐步解決。
項目內容、研究方法、創新點、預期成果(2000字以內)
一、項目內容:基于遼寧科技大學大物實驗實際教學情況和調查問卷的統計結果,開發一款能夠在學習、評價、教學、網絡基礎設施和教育生產力等方面發揮輔助作用的教育類APP,以及結合本校的實際運營效果探索出教育類APP的較好的實踐模式。具體開發內容主要包括以下幾個方面:
(1)UI和原型設計。
(2)app功能開發和服務器開發。
(3)app后臺管理系統開發。
(4)app測試。
(5)app主流應用平臺上架。
(6)app運營和維護,整理資料并發表研究論文。
- 研究方法:(1)調查法。初期已通過網上問卷等形式調查了遼寧科技大學學生們對大物實驗這種教育類APP的觀點、態度、建議及功能需求等相關情況,然后用統計分析的數據指導實際的開發過程,這樣以大多數同學的需求為導向,開發出來的軟件更有實用價值。軟件測試、運營、迭代等階段也會通過問卷、走訪等形式進行調查。
通過Axure工具進行UI和原型設計。通過Android studio和Xcode開發相應版本的APP功能。使用rudy開發后臺管理系統。結合整個開發實例發表研究論文。
三、創新點:(1)通過教育類APP探索新的預習模式。嘗試改變以前只寫預習報告的單一預習模式,在APP中增添預習資料和相應的練習題,強化預習效果。
(2)通過教育類APP整合教學資源。在APP上有機地整合大物實驗各種資料,并通過發布老師教學所用的實驗課件等資源來創造性地解決實驗課本的更新速度跟不上實驗儀器更新的速度的問題。
(3)依托教育類APP的線上線下相結合學習和教學模式的創新。嘗試通過APP和課堂這種有創造性的線上線下相結合的學習和教學模式,推進教育事業更快更好向前發展。這也無疑是互聯網加教育的偉大創新,對其他任何學科的教改都有很大的借鑒價值。
(4)通過教育類APP探索成績考核的新模式。嘗試改變傳統的以實驗報告為主體的考核模式,在APP上增加做練習題、測試題、觀看操作視頻等多元的考核方式,全面考核同學們的學習效果和學習能力,為培養綜合性、創新性人才奠定了基礎。
四、預期成果:(1)實現APP使用學號進行登錄的功能。
(2)實現APP做練習題的功能。
(3)實現APP做限時測試的功能。
(4)實現在APP上發布教學所用的實驗課件等資源的功能
(5)實現APP視頻教學模塊。
(6)實現在APP上提供數據表格和自助數據處理功能。
(7)在主流應用平臺上架所開發的APP。
(8)APP用戶數超過1500人。
(9)整理相關資料數據,總結教育類APP的研究和實踐過程,并發表研究論文。
第一階段(2017年4月),確定APP設計方案。
2、第二階段(2017年5~6月),UI和原型設計。
3、第三階段(2017年7~9月),app功能開發和構建服務器。
4、第四階段(2017年10~11月),app后臺管理系統開發。
5、第五階段(2018年12月),app測試。
6、第六階段(2018年1月),app主流應用平臺上架。
7、第七階段(2018年2~3月),app運營和維護,整理資料并發表研究論文
總費用預計為15000元,明細如下:?
? 1.?資料費3000元:包括書籍、軟件、打印費用等?
???2.?應用開發費10000元:包括存儲資料用移動硬盤、構建服務器等費用。 ????????????????
???3.?版面費2000元:用于發表論文。
項目指導教師意見 使用APP輔助大學物理實驗教學,可以使物理實驗課程教學更加多樣化,有效的加強了學生對大學物理實驗的理解和學習。這種讓互聯網與傳統教學模式進行深度融合的學習模式,充分發揮學習內容微型化、學習終端靈活化的優勢,實現高校學生按需學習、高效學習和快樂學習的理想,可使參與學生的自主學習能力有明顯的提高,同時也讓教師真正做到因材施教,給學生更大的學習空間,彌補了實驗課程教學時間不足的問題。 通過學生參與開發,有利于培養學生綜合運用多學科知識解決實際問題能力,提高創新意識和創新能力,開發學生潛能、調動學生學習積極性。 故而推薦該大創項目。? |
部分開發筆記(draft)
目錄
部分開發筆記(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數據處理模塊效果圖 36
四、其他 36
2.8應用于題庫的手勢滑動切題的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注冊功能代碼
注冊并將賬號和密碼上傳到服務器的代碼:
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登錄功能代碼
從服務器獲取密碼比較并登錄的邏輯代碼:
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="實驗教學"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系統已有的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="學號"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;/*** 消息界面數據*/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[]{"消息功能開發中", "消息功能開發中","消息功能開發中", "消息功能開發中"};private String[] timeMessage = new String[]{"2017/5/7 17:56", "2017/5/16 17:56","2017/5/7 17:56", "2017/16 17:56"};/*** 實驗界面數據*/private String groups[] = {"霍爾效應", "固體導熱系數", "表面張力","牛頓環", "油滴實驗", "干涉實驗", "熱電偶"};private String[][] childs={{"練習題","實驗課件","調試小視頻","數據處理"},{"練習題","實驗課件","調試小視頻","數據處理"},{"練習題","實驗課件","實驗操作視頻","數據處理"},{"練習題","實驗課件","實驗操作視頻","數據處理"},{"練習題","實驗課件","實驗操作視頻","數據處理"},{"練習題","實驗課件","實驗操作視頻","數據處理"},{"練習題","實驗課件","實驗操作視頻","數據處理"}};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}};/*** 我的界面數據*/private String[] titleMe = new String[]{"清空聊天記錄", "檢查更新", "關于小站", "設置"};@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();//創建第一個Tab頁TabHost.TabSpec tab1 = tabHost.newTabSpec("tab1").setIndicator("消息")//設置標題.setContent(R.id.tab01);//添加第一個tab頁tabHost.addTab(tab1);TabHost.TabSpec tab2 = tabHost.newTabSpec("tab2").setIndicator("全部實驗")//設置標題.setContent(R.id.tab02);//添加第一個tab頁tabHost.addTab(tab2);TabHost.TabSpec tab3 = tabHost.newTabSpec("tab3").setIndicator("我")//設置標題.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(),"研發中.....",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(),"研發中.....",Toast.LENGTH_SHORT).show();break;}break;default:Toast.makeText(getApplicationContext(),"研發中.....",Toast.LENGTH_SHORT).show();break;}Toast.makeText(getApplicationContext(),"研發中.....",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 {//返回一級列表的個數@Overridepublic int getGroupCount() {return groups.length;}//返回每個二級列表的個數@Overridepublic int getChildrenCount(int groupPosition) { //參數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;}}}/*** 裁剪圖片方法實現*/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/*");// 設置裁剪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);}/*** 保存裁剪之后的圖片數據*/protected void setImageToView(Intent data) {Bundle extras = data.getExtras();if (extras != null) {mBitmap = extras.getParcelable("data");//這里圖片是方形的,可以用一個工具類處理成圓形(很多頭像都是圓形,這種工具類網上很多不再詳述)touxiang.setImageBitmap(mBitmap);//顯示圖片//在這個地方可以寫上上傳該圖片到服務器的代碼,后期將單獨寫一篇這方面的博客,敬請期待...}}三、課件、視頻、題庫
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("固體導熱系數的測量");} 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="第一題 負效應有"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;}}
}
/*** 裁剪圖片方法實現*/
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/*");// 設置裁剪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);
}
/*** 保存裁剪之后的圖片數據*/
protected void setImageToView(Intent data) {Bundle extras = data.getExtras();if (extras != null) {mBitmap = extras.getParcelable("data");//這里圖片是方形的,可以用一個工具類處理成圓形(很多頭像都是圓形,這種工具類網上很多不再詳述)touxiang.setImageBitmap(mBitmap);//顯示圖片//在這個地方可以寫上上傳該圖片到服務器的代碼,后期將單獨寫一篇這方面的博客,敬請期待...}
}2.9數據處理模塊效果圖四、其他
2.8應用于題庫的手勢滑動切題的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軸坐標如果第一次按下時的坐標減去第二次離開屏幕時的坐標大于我們設置的位移,因為一個控件的原點是在左上角,就說明此時是向左滑動的viewFlipper.showNext();//顯示下一個視圖}else if(e2.getX() - e1.getX() > FLING_MIN_DISTANCE &&Math.abs(velocityX) > FLING_MIN_VELOCITY){//判斷x軸坐標如果第二次離開屏幕時的坐標減去第一次按下時的坐標大于我們設置的位移,因為一個控件的原點是在左上角,就說明此時是向右滑動的viewFlipper.showPrevious();//顯示上一個視圖}return true;}});}}未完待續 。。。。。。。。。。。
總結
以上是生活随笔為你收集整理的[省级大创项目]教育类APP的探索和实践——大学物理实验助手APP开发的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。