项目随记
1. 引導頁面(GuideActivity)
1.1需要判斷是否是第一次進入,如果是第一次進入則進入引導頁面,如果不是第一次則直接進入閃屏頁面
1.2下方選中頁面對應的點變?yōu)榧t色
//獲取手機的密度比
float density = this.getResources().getDisplayMetrics().density;
1.3設置viewpager的動畫(AnimTransformer)
/*
* 參數(shù)view:viewpager的條目的view對象
* view1:滑動出去的view 對應的position的值的范圍0~-1(當前可見條目 左邊)
* view2:滑動進來的view 對應的position的值的范圍1~0 (下一個條目 右邊)
* position:條目的view移動時的坐標
*/
1.4點擊“立即體驗”跳轉到閃屏界面(WelcomActivity)
2. 閃屏頁面(WelcomActivity)
2.1閃屏頁面的圖片從接口獲取,判斷如果此圖片在內存地址中不存在則緩存到本地,再將緩存到本地的圖片加載出來。
注:此項功能是為了以后如果再添加新的圖片或者廣告信息時,我們的圖片是固定的,獲取不到新的內容。
public void onSuccess(String result) {
JSONObject jsonObject = new JSONObject(result);
String pic = jsonObject.getString(“xxx”);
ImageOptions.Builder builder = new ImageOptions.Builder();
ImageOptions build = builder.setImageScaleType(ImageView.ScaleType.FIT_XY).build();
//加載文件(邊讀邊寫)
x.image().loadFile(pic, build, new CacheCallback() {
@Override
public boolean onCache(File result) {
FileInputStream fis=null;
FileOutputStream fos=null;
try {
fis = new FileInputStream(result);
File file =new File(path);
if(!file.exists()){
file.mkdirs();
}
fos = new FileOutputStream(file.getPath()+”/guanggao_logo.jpg”);
byte[] bytes = new byte[1024];
int len = 0;
while((len=fis.read(bytes))!=0){
fos.write(bytes,0,len);
}
fis.close();
fos.close();
2.2動畫(由暗到明)
//獲取窗體對象
final Window window = getWindow();
//屬性動畫,0.2~1的變化
ValueAnimator valueAnimator = ValueAnimator.ofFloat(0.2f, 1f);
valueAnimator.setDuration(3500);
//差值器 線性,線性均勻改變
valueAnimator.setInterpolator(new LinearInterpolator());
//動畫過程的監(jiān)聽
valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
//獲取當前的參數(shù)值
WindowManager.LayoutParams params = window.getAttributes();
//獲取當前運動點的值
params.alpha= (float) animation.getAnimatedValue();
window.setAttributes(params);
}
});
valueAnimator.start();
2.3動畫監(jiān)聽,動畫結束后直接跳轉到首頁 (HomeFragment)
3. 首頁(HomeFragment)
下方有四個按鈕,分別都有對應的頁面(Fragment),每個按鈕都有選擇器,按鈕的背景為半透明。
每個頁面的加載都需要一個加載的動畫,每個ImageView有未聯(lián)網(wǎng)時的默認圖片,所有的聯(lián)網(wǎng)操作都需要從API讀取數(shù)據(jù)并進行解析。
每個頁面頭部標題的返回圖標,都有自己的單擊事件,單擊則返回上一頁面。
3.1輪播圖 (getTurnsPic())
輪播圖的每個頁面都有對應的單擊事件,單擊跳轉的頁面有兩種,一種是app頁面(即對應內容的詳情信息),另一種是web頁面,跳轉到一個網(wǎng)頁(WebViewActivity)。
//?“pictype”:”app”(值為APP時候連接APP的專題頁,為web時候連接到picUR,
// *注:連接到picUR后需要傳遞兩個參數(shù)acode=ACODE值&uid=用戶帳號)
String url = slidesBeanList.get(position % slidesBeanList.size()).picURL;
if (SpUtil.getBoolean(MainActivity.IS_LOGIN,mActivity)){
String acode = SpUtil.getString(LoginActivity.ACODE, mActivity);
String username = SpUtil.getString(LoginActivity.USERNAME, mActivity);
url = url+”?acode=”+acode+”&uid=”+username;
}
注:
1. 輪播圖點擊跳轉的詳細信息頁面的標題是從API端獲取的對應標題
2. 長點時輪播圖停止播放,松手返回后則停留幾秒繼續(xù)輪播(發(fā)送廣播)
3. 跳轉到網(wǎng)頁頁面(WebViewActivity)時有一個自定義的加載動畫
4. 登錄 (LoginActivity)
4.1登錄信息的回顯,’記住密碼’ 復選框的勾選。
4.2下拉三角控制PopUpWindow的彈出與收回,自定義ListView填充到PopUpWindow中,在PopUpWindow顯示已經(jīng)登錄過的用戶。
//listView填充到popPopUpWindow里
popupWindow.setContentView(listView);
popupWindow.setBackgroundDrawable(new ColorDrawable(Color.parseColor(“#fff5f5f5”)));
popupWindow.setOutsideTouchable(true);//點pop外邊則收回
popupWindow.showAsDropDown(username,0,0);//以username為起點彈出
4.3登錄
登錄中則彈出‘登錄中’對話框,如果登錄失敗則彈出‘用戶密碼錯誤’對話框
注:自定義對話框需要在老主題(5.0以下android.theme)下使用
alertDialog = new AlertDialog.Builder(this).create();
alertDialog.show();
alertDialog.setCancelable(false);
Window window = alertDialog.getWindow();
window.setContentView(R.layout.login_dialog_layout);
window.findViewById(R.id.ib_cancel).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
return;
}
});
4.4忘記密碼 (ForgetPwdActivity)
1. 獲取驗證碼,設置60秒重新發(fā)送驗證碼,實現(xiàn)倒計時功能 (SendSmsTimerUtils)
/**
* 獲取驗證碼
* 第一步:初始化工具類關聯(lián)需要實現(xiàn)倒計時功能
* 第一個參數(shù):控件(需要實現(xiàn)倒計時的控件)
* 第二個參數(shù):倒計時總時間,以毫秒為單位;
* 第三個參數(shù):漸變事件,最低1秒,也就是說設置0-1000都是以一秒漸變,設置1000以上改變漸變時間
* 第四個個參數(shù):點擊控件之前的背景
* 第五個參數(shù):點擊控件之后的背景
*/
mCountDownTimerUtils = new SendSmsTimerUtils(bt_sendsms_code, 60000, 1000);
2. 點擊‘驗證’跳轉到修改密碼頁面
注:api參數(shù)錯誤,無法正常獲取
4.5優(yōu)化:activity退出后把數(shù)據(jù)保存到本地 (SaveUserUtils)
SaveUserUtils.saveUserList(this,datas);
1. 利用流將用戶存取到本地
2. 將本地保存的用戶json串裝換為數(shù)組傳回去
5. 注冊 (RegisterActivity)
5.1每個獲取內容的控件都需要進行判斷,只要有一項不符合條件,都不能注冊成功并彈出吐司
5.2獲取短信驗證碼,對手機號碼進行判斷,設置電話號碼的格式(正則表達式)
//正則表達式(合法的電話號碼)
public static boolean isPhoneLegal(String str) throws PatternSyntaxException {
String regExp = “^((13[0-9])|(15[^4])|(18[0,2,3,5-9])|(17[0-8])|(147))\d{8}”;??
????????Pattern?p?=?Pattern.compile(regExp);??
????????Matcher?m?=?p.matcher(str);??
????????return?m.matches();??
????}??
5.3設置密碼的格式(正則表達式),密碼可見不可見//正則表達式(合法的密碼格式)??
????//正則表達式(合法的密碼格式)??
????public?static?boolean?isPwdLegal(String?str)?throws?PatternSyntaxException?{??
????????String?pwdExp?=”(?!^[0-9]+)(?!^[A-z]+)(?!^[^A-z0-9]+)^.{4,16}$”;
Pattern pattern = Pattern.compile(pwdExp);
Matcher matcher = pattern.matcher(str);
return matcher.matches();
}
5.4從assets文件夾下獲取中仕學社用戶協(xié)議
intent.putExtra(“url”,”file:///android_asset/registerinfo.html”);
6. 首頁簽到功能 (HomeFragment——>SignActivity)
6.1獲取簽到狀態(tài),如果沒有簽到則顯示‘點擊右上角簽到’,右上角簽到背景為黃色,如果已簽到,點擊則顯示‘您今天已經(jīng)簽到過’,背景為灰色
//獲取當前系統(tǒng)的年月日(格式輸出)
SimpleDateFormat simpleDateFormat = new SimpleDateFormat(“yyyy-M-d”);
String label = simpleDateFormat.format(new Date());
6.2簽到的進度條,要顯示簽到天數(shù),根據(jù)簽到天數(shù)用紅色進度條填充原有的黃色進度條
6.3將已簽到的天數(shù)背景換為綠色,顯示已經(jīng)連續(xù)簽到的天數(shù),數(shù)字要變?yōu)榧t色,同時也要顯示獲得的積分,和額外積分
//將部分字體變色
SpannableStringBuilder builder = new SpannableStringBuilder(s);
int index = (s).indexOf(signBean.days);
ForegroundColorSpan span = new ForegroundColorSpan(0xffff2b4b);
builder.setSpan(span,index,index+signBean.days.length(), Spannable.SPAN_INCLUSIVE_INCLUSIVE);
tv_sign_lianxu.setText(builder);
6.4連續(xù)簽到七天,則重新回到第一天
6.5點擊簽到,顯示‘簽到中’的對話框
7. 搜索:點擊首頁上方搜索課程跳轉到搜索頁面 (HomeFragment——>SearchActivity)
7.1搜索欄小×號的顯示
判斷搜索欄是否有內容,點擊×號清空輸入的內容
7.2四個頁簽,移動指示器(默認初始化第一頁)
//移動指示器
int i = DensityUtil.dip2px(SearchActivity.this, 10);
// 指示器移動的距離 = 一個指示器的寬度+position*一個指示器的寬度
int offsetX = (int) (screenWidth /pagerList.size()-i+(position-1)*(screenWidth /pagerList.size()));
params.leftMargin = offsetX+i ;//設置左邊距
注:點擊頁簽也獲取相應的列表內容(細節(jié)優(yōu)化)
7.3從接口獲取‘熱門搜索’的數(shù)據(jù),設置每個小條目的布局及單擊事件
7.4單擊熱門搜索下的小條目,跳轉到對應的詳細課程界面,從接口獲取課程信息,該頁面具有下拉刷新,上拉加載更多的功能。
(SearchPager)
7.5最近搜索(saveSearchList()):保存最近搜索的內容,將最近搜索的條目內容存放在一個文件中,如果此條目在最近搜索中存在,則只在最近搜索顯示一次,如果沒有存在過,則關閉后顯示在最近搜索中。
String save_file = SpUtil.getString(SAVE_FILE, activity);
if (save_file.contains(strings)){
return;
}
SpUtil.putString(SAVE_FILE,strings+”,”+save_file,activity);
7.6最近搜索旁邊的刪除圖標,具有點擊事件,點擊則刪除最近搜索中的所有條目。
7.7搜索(getSearchData()):判斷搜索框中是否有內容,如果沒有則彈吐司,如果在搜索框中輸入了內容,點擊搜索后分為兩種情況:一、搜索框中的內容沒有找到相匹配的內容,則顯示沒有找到搜索的課程界面,點擊‘還可以征訂該課程’,則跳轉到征訂界面。二、搜索框中的內容找到了具有該關鍵字的條目,則顯示所有條目,單擊跳轉課程詳情頁面。(輸入的關鍵字需要改變顏色)
FormatUtil
//將搜索到的關鍵字變成藍色
public static SpannableStringBuilder getSearchIndex(String title,String searchStr) {
int index = (title.toLowerCase()).indexOf(searchStr.toLowerCase());
SpannableStringBuilder builder = new SpannableStringBuilder(title);
if(index!=-1){
ForegroundColorSpan span = new ForegroundColorSpan(0xff759dda);
builder.setSpan(span,index,index+searchStr.length(), Spannable.SPAN_INCLUSIVE_INCLUSIVE);
}
return builder;
}
8. 文章(搜索頁面下的文章頁簽) SearchPager——>ArticleActivity
8.1點擊熱門搜索條目,跳轉到詳情頁面后,點擊每個條目,則從接口拉取文章的全部內容(getDataFromNet()),因為接口包含代碼塊,所以我們要手動適配內容到webView。
web_article.setHorizontalScrollBarEnabled(false);//關閉橫向滾動
WebSettings settings = web_article.getSettings();
settings.setUseWideViewPort(true);//可以任意比例縮放
settings.setLoadWithOverviewMode(true);//縮放至屏幕大小,適配
settings.setTextZoom(250);//設置字體比例大小
settings.setSupportZoom(true);//支持縮放
web_article.loadDataWithBaseURL(null, articleDataBean.kc_content,”text/html”,”utf-8”,null);//加載代碼段
8.2獲取‘精彩評論’內容(getPingLunContent()),如果沒有評論,則顯示‘暫無評論,趕緊過來搶沙發(fā)吧~’,如果有評論則顯示,并顯示‘查看更多評論’按鈕,點擊則跳轉到評論界面(ArticleActivity——>PingLunMoreActivity)。
8.3獲取‘相關閱讀’內容(getSameCourseFromNet()),從接口獲取內容,判斷是否有圖片,如果沒有則隱藏圖片框
8.4分享
8.5答疑 (ArticleActivity——>DaYiActivity)
1. 判斷是否登錄,登錄則跳轉到答疑頁面,無登錄則跳轉到登錄頁面。
2. 答疑頁面:點擊‘提交’按鈕,如果EditText的內容為空,則彈出吐司,如果不為空,則保存EditText的答疑問題(接口)
3. 提交:提交中則彈出提交對話框(自定義對話框)
4. 提交成功后跳轉到 個人中心–我的答疑
8.6評論 (ArticleActivity——>PingLunMoreActivity)
1. 在文章頁面,如果沒有評論則‘精彩評論’中顯示‘暫無評論,趕緊過來搶沙發(fā)吧’,如果有評論則顯示評論內容和查看更多評論按鈕,點擊‘查看更多評論’按鈕,跳轉到評論頁面。
2. 點擊‘評論’,判斷是否登錄,登錄則跳轉到評論頁面,無登錄則跳轉到登錄頁面。
3. 評論頁面:點擊‘發(fā)送’按鈕,如果EditText的內容為空,則彈出吐司,如果不為空,則保存評論內容并顯示(接口)
4. 標題欄顯示評論的數(shù)目
5. 更多評論頁面具有下拉刷新,上拉加載更多功能
8.7收藏 (ArticleActivity)
1. 添加收藏的點擊事件
2. 點擊‘收藏’,判斷是否登錄,無登錄則跳轉到登錄頁面。
3. 添加收藏(接口)【addCollect()】,設置圖片,重新獲取數(shù)據(jù)(刷新)
4. 取消收藏(接口)【removeCollect()】,設置圖片,重新獲取數(shù)據(jù)(刷新)
總結
- 上一篇: Linux究竟值多少钱?
- 下一篇: Docker 容器文件拷贝及目录挂载