视频项目笔记(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);    }}

好了,笔记写好,把不懂的也网上找了知识补充,天天防腐的视频教学第一天完成,谢谢老师的一番讲解,记录下来,方便以后遇到问题可以查找帮助。下课噜!

原创粉丝点击