视频项目笔记(1)
来源:互联网 发布:模拟退火算法题目应用 编辑:程序博客网 时间:2024/05/18 01:50
天天防腐笔记
坚持看视频,忘记的东西只能铭记
- 1、AppCommActivity介绍
Fragment app 3.0出来的 V4包是为了兼容1.6到3.0的fragment兼容
ActionBar也向前支持,这次发生在V7包,得继承ActionBarActivity
5.0也出现很多新东西 v7也更新了 所以有了appCommActivity
- 2、加载布局xml
xml解析页面->View.inflate(this,R.layout.**,null)方法
先是这样写LayoutInflater.from(this).inflate(R.layout.**,null)
- 3、停顿5秒的方法(即闪屏页)
1.sleep(),不允许延迟操作,但可以开个线程
new Thread(new Runnable() { 重写run() }.start();
2.handle发送延迟消息
3.Timer类
4.动画 0.7-1.0(主要是用这种,分四步走即 对象、设置、开启、监听)
private ImageView imageView;
//1.获取动画对象ofFloat方法 目标 需要的效果 透明度0.7f 1.0f ObjectAnimator animator = ObjectAnimator.ofFloat(imageView,"alpha",0.7f,1.0f); //2.设置时间 animator.setDuration(3000); //3.开启动画 animator.start(); //4.跳转页面,添加一个监听器,并传入内部类AnimatorListenerAdapter 回调onAnimationEnd方法 animator.addListener(new AnimatorListenerAdapter() { @Override public void onAnimationEnd(Animator animation) { super.onAnimationEnd(animation); //跳转页面 Intent intent = new Intent(WelcomeActivity.this, MainActivity.class); startActivity(intent); // 在主页面按返回又回到了Welcome 你一进主页面就应该从Task 里面移除 ActivityManagerUtil.getInstance().finishActivity(WelcomeActivity.this); } }); }
- 4、 底部栏设置
解决方案:
1.viewpager + Fragment + RadioButtoon(主要用这种VFR)
2.过时的Tabhost + fragment(TF)
3.ViewGroup + fragment + 动态切换 会不断销毁和创建(VF)
具体实现:
HomePageAdapter + MainActivity
(a)适配器继承自FragmentPagerAdapter,传入Fragment的集合,重写方法就写好一个适配器,很简单。
public class HomePageAdapter extends FragmentPagerAdapter{ //内容Fragment的集合 private ArrayList<Fragment> mfragments; public HomePageAdapter(FragmentManager fm, ArrayList<Fragment> fragments) { super(fm); this.mfragments = fragments; } @Override public Fragment getItem(int position) { return mfragments.get(position); } @Override public int getCount() { return mfragments.size(); }}
(b) 对ViewPager配置适配器 , 初始化Fragment对应的集合,添加进去
对RadioButton监听,对应四个页面调用方法mViewPager.setCurrentItem( 0到3 ,false); onPageSelected()回调方法中设置图标点亮 mXXXRb.setChecked(true);
public class MainActivity extends AppCompatActivity implements View.OnClickListener, ViewPager.OnPageChangeListener { private ViewPager mViewPager; private RadioButton mHomeRb,mCollectionRb,mMessageRb,mCenterRb; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initView(); initData(); } /** * 初始化界面 */ private void initView() { mViewPager = (ViewPager) findViewById(R.id.view_pager); mHomeRb = (RadioButton) findViewById(R.id.home_rb); mCollectionRb = (RadioButton) findViewById(R.id.collection_rb); mMessageRb = (RadioButton) findViewById(R.id.message_rb); mCenterRb = (RadioButton) findViewById(R.id.collection_rb); mHomeRb.setOnClickListener(this); mCollectionRb.setOnClickListener(this); mMessageRb.setOnClickListener(this); mCenterRb.setOnClickListener(this); mViewPager.setOnPageChangeListener(this); } /** * 初始化数据 */ private void initData() { //Fragment的集合 ArrayList<Fragment> fragments = new ArrayList<>();//1.7里面的写法 //在集合添加Fragment fragments.add(new HomeFragment()); fragments.add(new CollectionFragment()); fragments.add(new MessageFragment()); fragments.add(new CenterFragment()); //自己多传入一个fragments集合 HomePageAdapter adapter = new HomePageAdapter(getSupportFragmentManager(),fragments); mViewPager.setAdapter(adapter); } @Override public void onClick(View view) { switch(view.getId()){ case R.id.home_rb: //把他切换到第一页,false为不要切换效果 mViewPager.setCurrentItem(0,false); break; case R.id.collection_rb: mViewPager.setCurrentItem(1,false); break; case R.id.message_rb: mViewPager.setCurrentItem(2,false); break; case R.id.center_rb: mViewPager.setCurrentItem(3,false); break; } } //监听滑动的回调方法 @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { } @Override public void onPageSelected(int position) { //切换到相应的页面图标点亮 switch (position){ case 0: mHomeRb.setChecked(true); break; case 1: mCollectionRb.setChecked(true); break; case 2: mMessageRb.setChecked(true); break; case 3: mCenterRb.setChecked(true); break; } } @Override public void onPageScrollStateChanged(int state) { }}
- 5、设置全屏
没有ActionBar
android:theme=”@style/Theme.AppCompat.Light.NoActionBar”
全屏,千万记住 WelcomeActivity 一定要继承 Activity
android:theme=”@android:style/Theme.Light.NoTitleBar.Fullscreen
- 6、获取后台数据+数据解析
在这里使用okhttp,也可以分为四步走(对象、请求体、请求、发送)
CBRE:
OkHttpClient- ->MultipartBody.Builder- ->
Request- - >newCall(request).enqueue(Callback对调)
这里要注意在提交builder时,即post (builder.build() ) . build()
参数里的build()是MultipartBody的方法,外面的build()是Request的方法,而且两者都有Builder静态类。
Gson解析
new Gson()- - > gson.fromJson(获取的后天数据,JavaBean类)
//解析可操作的对象
Gson gson = new Gson();
mHomeDataResult = gson.fromJson(result,HomeDataResult.class);
/** * 请求后台数据 */ private void requestHomeData() { //OKhttp //1.创建一个OkHttpClient对象 OkHttpClient okHttpClient = new OkHttpClient(); //2.构造参数的boby MultipartBody.FORM表单形式 MultipartBody.Builder builder = new MultipartBody.Builder().setType(MultipartBody.FORM); //2.2封装参数 builder.addFormDataPart("appid","1");// builder.addFormDataPart("");//添加多个参数 //3.构造一个请求 post提交里面参数是builder url()请求的路径 Request request = new Request.Builder().url("http://v2.ffu365.com/index.php?m=Api&c=Index&a=home") .post(builder.build()).build(); //4.发送一个请求 okHttpClient.newCall(request).enqueue(new Callback() { @Override public void onFailure(Call call, IOException e) { //失败 } @Override public void onResponse(Call call, Response response) throws IOException { //成功 数据在response里面 获取后台给我们的JSON字符串 String result = response.body().string(); Log.e("TAG",result); //解析可操作的对象 Gson gson = new Gson(); mHomeDataResult = gson.fromJson(result,HomeDataResult.class); showHomeData(mHomeDataResult.getData()); } }); }
- 7、Glide显示图片
参数1、设置图片 2、设置图片的路径 3、设置给谁
Glide.with(mContext).load(adBannerImage) .into(mAdbannerIv);
这里在子线程进行耗时的下载操作,主线程更新界面
在这里需要一个主线程更新UI,此时run()回调方法是在主线程的:new Handler() - -> mHandle.post(Runnable匿名内部类)。
在Activity,开启子线程在主线程更新代码:
new Thread(new Runnable() { @Override public void run() { runOnUiThread(new Runnable() { @Override public void run() { //这是运行在主线程,更新UI } }); } }).start();
/** * 显示首页数据 * @param data */ private void showHomeData(final HomeDataResult.DataBean data) { mHandle.post(new Runnable() { @Override public void run() { //运行在主线程 //----显示首页图片--- //从后台返回数据中获取广告的图片路径 String adBannerImage = data.getAd_list().get(0).getImage(); //SmartImageView Glide Glide.with(mContext).load(adBannerImage) .into(mAdbannerIv); //可以一直点的是链表模式,一般会出现在builder模式里面 Glide.with(mContext).load(data.getAd_list().get(0).getImage()).into(mRecommendedCompanyIv);// 但是如果直接使用 android:scaleType="fitXY" 会导致图片变形,不使用界面不美观 //----显示列表----ScrollView和ListView冲突,只有一行数据 mNewsLv.setAdapter(new HomeInfoListAdapter(mContext,data.getNews_list())); } }); }
- 8、解决问题:直接使用 android:scaleType=”fitXY” 会导致图片变形,不使用界面不美观
这里获取图片的比例自定义View
- ->context.obtainStyledAttributes()获取属性值
- ->array.getFloat()获取单个属性值
- ->array.recycle()刷新属性
这里使用获取宽度的值按比例去设置高度的值
//宽
int width = MeasureSpec.getSize(widthMeasureSpec);
//高 比例2/1
int height = (int) (width*mHeightProportion/mWidthProportion);
//设置宽高
setMeasuredDimension(width,height);
import android.content.Context;import android.content.res.TypedArray;import android.util.AttributeSet;import android.util.Log;import android.widget.ImageView;import com.gzucm.daydayfanfu.R;public class ProportionImageView extends ImageView{ private float mWidthProportion; private float mHeightProportion; //new时使用下面的构造方法 public ProportionImageView(Context context) { this(context,null); } //layout声明时用 public ProportionImageView(Context context, AttributeSet attrs) { this(context, attrs,0); } //布局声明并且自己有style的 public ProportionImageView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); initAttribute(context,attrs); } private void initAttribute(Context context, AttributeSet attrs) { //获取属性的数组 TypedArray array = context.obtainStyledAttributes(attrs, R.styleable.ProportionImageView); //获取单个属性值 mWidthProportion = array.getFloat(R.styleable.ProportionImageView_widthProportion,0); mHeightProportion = array.getFloat(R.styleable.ProportionImageView_heightProportion,0); Log.e("TAG",mWidthProportion + " " + mHeightProportion); array.recycle(); } //1.基本控件 extends View TextView Button //2.高级控件 ListView //3.自定义控件 就是官方给的View不能实现的结果 //自定义View都会继承自系统的 View ViewGroup @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); //宽 int width = MeasureSpec.getSize(widthMeasureSpec); //高 比例2/1 int height = (int) (width*mHeightProportion/mWidthProportion); //设置宽高 setMeasuredDimension(width,height); }}
<declare-styleable name="ProportionImageView" > <attr name="widthProportion" format="float"/> <attr name="heightProportion" format="float"/> </declare-styleable>
- 9、ScrollView和ListView冲突,只有一行数据
让ListView继承它
模式有3种,用int型整数保存,前2位表示大小模式,后30位表示大小的值
1.精确模式(MeasureSpec.EXACTLY) 01
2.最大模式(MeasureSpec.AT_MOST) 11
3.未指定模式(MeasureSpec.UNSPECIFIED) 00
Integer.MAX_VALUE >> 2就代表能获取到的最大值(不含模式下的值)
或当GridView的高度为Wrap_content,外部包裹ScrollView时也是类似的原理
public class ImplantListView extends ListView { public ImplantListView(android.content.Context context, android.util.AttributeSet attrs) { super(context, attrs); } public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {// 测量方法 计算 int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2, MeasureSpec.AT_MOST); super.onMeasure(widthMeasureSpec, expandSpec); }}
好了,笔记写好,把不懂的也网上找了知识补充,天天防腐的视频教学第一天完成,谢谢老师的一番讲解,记录下来,方便以后遇到问题可以查找帮助。下课噜!
- 视频项目笔记(1)
- 视频项目笔记(2)
- 视频项目笔记(3)
- 视频项目笔记(4)
- 视频项目笔记(5)
- OtoStudio学习笔记1(视频截图)
- camera视频学习笔记(1)
- 视频笔记1
- 视频笔记1
- OC视频笔记-1
- 笔记十八(视频)
- 搜车记项目演示(视频)
- 基于Z301P摄像头 H.264OK6410的远程视频web监控 项目笔记1
- Eclipse下为Android项目进行单元测试(传智播客视频笔记)
- 基于Z301P摄像头 H.264OK6410的远程视频web监控 项目笔记5(CGI)
- 转]移动视频监控(1)---项目综述
- 基于mjpg-streamer远程视频WEB监控 项目笔记一
- 基于mjpg-streamer远程视频WEB监控 项目笔记二
- COJ1981-小M的魔术表演
- 引用--引用作参数
- angularjs和ztree的最简使用
- 欢迎使用CSDN-markdown编辑器
- 日常总结2
- 视频项目笔记(1)
- centos 配置SAN存储--IPSAN
- 深入理解ArrayList
- 解决分布式系统的一致性问题,我们需要了解哪些理论?
- exgcd拓展欧几里得
- PHP写一段代码,确保多个进程同时写入一个文件成功
- php中一个字符串和一个数字相加的规则是什么?
- 请教python3处理postgresql的copy语句的问题,on windows
- 哔哩哔哩-2017前端面试