项目随记

1. 引导页面(GuideActivity)

1.1需要判断是否是第一次进入,如果是第一次进入则进入引导页面,如果不是第一次则直接进入闪屏页面
1.2下方选中页面对应的点变为红色
//获取手机的密度比
float density = this.getResources().getDisplayMetrics().density;
1.3设置viewpager的动画(AnimTransformer)
/*
* 参数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());
//动画过程的监听
valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
//获取当前的参数值
WindowManager.LayoutParams params = window.getAttributes();
//获取当前运动点的值
params.alpha= (float) animation.getAnimatedValue();
window.setAttributes(params);
}
});
valueAnimator.start();
2.3动画监听,动画结束后直接跳转到首页 (HomeFragment)

3. 首页(HomeFragment)

下方有四个按钮,分别都有对应的页面(Fragment),每个按钮都有选择器,按钮的背景为半透明。
每个页面的加载都需要一个加载的动画,每个ImageView有未联网时的默认图片,所有的联网操作都需要从API读取数据并进行解析。
每个页面头部标题的返回图标,都有自己的单击事件,单击则返回上一页面。
3.1轮播图 (getTurnsPic())
轮播图的每个页面都有对应的单击事件,单击跳转的页面有两种,一种是app页面(即对应内容的详情信息),另一种是web页面,跳转到一个网页(WebViewActivity)。
// “pictype”:”app”(值为APP时候连接APP的专题页,为web时候连接到picUR,
// *注:连接到picUR后需要传递两个参数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. 长点时轮播图停止播放,松手返回后则停留几秒继续轮播(发送广播)
3. 跳转到网页页面(WebViewActivity)时有一个自定义的加载动画

4. 登录 (LoginActivity)

4.1登录信息的回显,’记住密码’ 复选框的勾选。
4.2下拉三角控制PopUpWindow的弹出与收回,自定义ListView填充到PopUpWindow中,在PopUpWindow显示已经登录过的用户。
//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秒重新发送验证码,实现倒计时功能 (SendSmsTimerUtils)
/**
* 获取验证码
* 第一步:初始化工具类关联需要实现倒计时功能
* 第一个参数:控件(需要实现倒计时的控件)
* 第二个参数:倒计时总时间,以毫秒为单位;
* 第三个参数:渐变事件,最低1秒,也就是说设置0-1000都是以一秒渐变,设置1000以上改变渐变时间
* 第四个个参数:点击控件之前的背景
* 第五个参数:点击控件之后的背景
*/
mCountDownTimerUtils = new SendSmsTimerUtils(bt_sendsms_code, 60000, 1000);
2. 点击‘验证’跳转到修改密码页面
注:api参数错误,无法正常获取
4.5优化:activity退出后把数据保存到本地 (SaveUserUtils)
SaveUserUtils.saveUserList(this,datas);
1. 利用流将用户存取到本地
2. 将本地保存的用户json串装换为数组传回去

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();
}

//密码可见不可见
  cb_register_islook.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
      @Override
      public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
          if (isChecked){
             et_register_mima.setTransformationMethod(HideReturnsTransformationMethod.getInstance());
          }else{
             et_register_mima.setTransformationMethod(PasswordTransformationMethod.getInstance());
          }
          et_register_mima.postInvalidate();//提交设置
          et_register_mima.setSelection(et_register_mima.getText().length());//光标定位到最后
      }
  });

5.4从assets文件夹下获取中仕学社用户协议
intent.putExtra(“url”,”file:///android_asset/registerinfo.html”);

6. 首页签到功能 (HomeFragment——>SignActivity)

6.1获取签到状态,如果没有签到则显示‘点击右上角签到’,右上角签到背景为黄色,如果已签到,点击则显示‘您今天已经签到过’,背景为灰色
//获取当前系统的年月日(格式输出)
SimpleDateFormat simpleDateFormat = new SimpleDateFormat(“yyyy-M-d”);
String label = simpleDateFormat.format(new Date());
6.2签到的进度条,要显示签到天数,根据签到天数用红色进度条填充原有的黄色进度条
6.3将已签到的天数背景换为绿色,显示已经连续签到的天数,数字要变为红色,同时也要显示获得的积分,和额外积分
//将部分字体变色
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连续签到七天,则重新回到第一天
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 ;//设置左边距

//默认初始化第一页
    pagerList.get(0).setInitData(0);

注:点击页签也获取相应的列表内容(细节优化)
7.3从接口获取‘热门搜索’的数据,设置每个小条目的布局及单击事件
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()),如果没有评论,则显示‘暂无评论,赶紧过来抢沙发吧~’,如果有评论则显示,并显示‘查看更多评论’按钮,点击则跳转到评论界面(ArticleActivity——>PingLunMoreActivity)。
8.3获取‘相关阅读’内容(getSameCourseFromNet()),从接口获取内容,判断是否有图片,如果没有则隐藏图片框
8.4分享
8.5答疑 (ArticleActivity——>DaYiActivity)
1. 判断是否登录,登录则跳转到答疑页面,无登录则跳转到登录页面。
2. 答疑页面:点击‘提交’按钮,如果EditText的内容为空,则弹出吐司,如果不为空,则保存EditText的答疑问题(接口)
3. 提交:提交中则弹出提交对话框(自定义对话框)
4. 提交成功后跳转到 个人中心–我的答疑
8.6评论 (ArticleActivity——>PingLunMoreActivity)
1. 在文章页面,如果没有评论则‘精彩评论’中显示‘暂无评论,赶紧过来抢沙发吧’,如果有评论则显示评论内容和查看更多评论按钮,点击‘查看更多评论’按钮,跳转到评论页面。
2. 点击‘评论’,判断是否登录,登录则跳转到评论页面,无登录则跳转到登录页面。
3. 评论页面:点击‘发送’按钮,如果EditText的内容为空,则弹出吐司,如果不为空,则保存评论内容并显示(接口)
4. 标题栏显示评论的数目
5. 更多评论页面具有下拉刷新,上拉加载更多功能
8.7收藏 (ArticleActivity)
1. 添加收藏的点击事件
2. 点击‘收藏’,判断是否登录,无登录则跳转到登录页面。
3. 添加收藏(接口)【addCollect()】,设置图片,重新获取数据(刷新)
4. 取消收藏(接口)【removeCollect()】,设置图片,重新获取数据(刷新)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值