安卓组件总结

    Recyclerview
            一  简介:
                Recyclerview是谷歌公司推出了一个用于大量数据展示的新控件,用于替代listview,给用户带来极大的方便性与灵活性。
            二  使用方法:
            1.导入Recyclerview依赖( implementation 'com.android.support:recyclerview-v7:28.0.0')
            2.编写布局以及itemView布局
            main.xml

    <android.support.v7.widget.RecyclerView android:layout_height="match_parent"     android:layout_width="match_parent" android:id="@+id/review"/>


            itemView布局

   <ImageView android:layout_height="150dp" android:layout_width="150dp" android:sr`在这里插入代码片`c="@mipmap/ic_launcher" android:id="@+id/img_iv"/>
    <LinearLayout android:layout_height="80dp" android:layout_width="150dp" android:layout_alignBottom="@+id/img_iv" android:orientation="vertical" android:alpha="0.5" android:background="#000">
    <TextView android:layout_height="50dp" android:layout_width="match_parent" android:id="@+id/text01"/>
    <TextView android:layout_height="50dp" android:layout_width="match_parent" android:id="@+id/text02"/>
    </LinearLayout>


            3.生成RecyclerView数据源(生成Bean类略)       

   public class Mysynctask  extends AsyncTask<String,Void,String>{
                    String  str = "http://mrobot.pcauto.com.cn/v2/cms/channels/3?pageNo=1&pageSize=20&v=4.0.0";
                    StringBuffer  sbf = new StringBuffer();
                    List<Bean.DataBean> data;
                    private Myadapter  myadapter;
                    private RecyclerView  recyclerView;
                
                    public Mysynctask(String str,List<Bean.DataBean> data, Myadapter myadapter, RecyclerView recyclerView) {
                        this.str = str;
                        this.data = data;
                        this.myadapter = myadapter;
                        this.recyclerView = recyclerView;
                    }
                
                    @Override
                    protected String doInBackground(String... strings) {
                        try {
                            URL url = new URL(str);
                            HttpURLConnection con = (HttpURLConnection) url.openConnection();
                            con.setConnectTimeout(1000*30);
                            con.setReadTimeout(1000*60);
                            con.setRequestMethod("GET");
                            if(con.getResponseCode() == 200) {
                                InputStream is = con.getInputStream();
                                byte[] bys = new byte[1024];
                                int  len = 0;
                                while((len = is.read(bys))!=-1) {
                                    sbf.append(new String(bys,0,len));
                                }
                            }
                        } catch (MalformedURLException e) {
                            e.printStackTrace();
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                        return sbf.toString();
                    }
                
                    @Override
                    protected void onPostExecute(String s) {
                        super.onPostExecute(s);
                        Gson gson = new Gson();
                        Bean bean = gson.fromJson(s, Bean.class);
                        data = bean.getData();
                        myadapter = new Myadapter();
                        recyclerView.setAdapter(myadapter);
                        myadapter.refresh(data);
                    }
                }


        4.编写RecyclerView适配器
   

    public class Myadapter extends RecyclerView.Adapter<Myadapter.ViewHolder>{
        List<Bean.DataBean> data = new ArrayList<>();
        private Context  context;
    
    
        public  void  refresh(List<Bean.DataBean> data){
            this.data.addAll(data);
            notifyDataSetChanged();
        }
    
        @NonNull
        @Override
        public ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
            context = viewGroup.getContext();
            View view = LayoutInflater.from(context).inflate(R.layout.item_layout, viewGroup, false);
            return new ViewHolder(view);
        }
    
        @Override
        public void onBindViewHolder(@NonNull ViewHolder viewHolder, int i) {
            viewHolder.textView01.setText(data.get(i).getTitle());
            viewHolder.textView02.setText(data.get(i).getId());
            //viewHolder.img.setImageBitmap(BitmapFactory.decodeFile(data.get(i).getImage()));
            Picasso.with(context).load(data.get(i).getImage()).into(viewHolder.img);
        }
    
        @Override
        public int getItemCount() {
            return data.size();
        }
    
        class  ViewHolder  extends   RecyclerView.ViewHolder{
            ImageView  img;
            TextView  textView01,textView02;
            public ViewHolder(@NonNull View itemView) {
                super(itemView);
                img = itemView.findViewById(R.id.img_iv);
                textView01 = itemView.findViewById(R.id.text01);
                textView02 = itemView.findViewById(R.id.text02);
            }
        }
    }


    
        5.设置item点击事件
   

     public class MainActivity extends AppCompatActivity {
    
        private RecyclerView review;
        private  Myadapter myadapter;
        private List<Bean.DataBean> data;
        String  s = "http://mrobot.pcauto.com.cn/v2/cms/channels/3?pageNo=1&pageSize=20&v=4.0.0";
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            initView();
        }
    
        private void initView() {
            review = (RecyclerView) findViewById(R.id.review);
            StaggeredGridLayoutManager manager = new StaggeredGridLayoutManager(3, StaggeredGridLayoutManager.VERTICAL);
            manager.setOrientation(LinearLayoutManager.VERTICAL);
            review.setLayoutManager(manager);
            myadapter = new Myadapter();
            new  Mysynctask(s,data,myadapter,review).execute();
        }
    }


            三  常见方法:      

 LinearLayoutManager:recyclerview线性管理器(vertical和horizontal)(默认垂直(vertical)
                GridLayoutManager:网格布局管理器;
                StaggeredGridLayoutManager:瀑布流布局管理器;
                RecyclerView.setLayoutManager(LayoutManager manager):添加布局管理器
                RecyclerView.addItemDecoration(ItemDecoration decoration):添加分割线
                RecyclerView.setItemAnimator(ItemAnimator animator):添加动画方法
                RecyclerView.setAdapter(Adapter adapter):添加适配器

ToolBar与DrawerLayout使用

ToolBar使用:

  1. xml中使用<android.support.v7.widget.Toolbar/>声明

Toolbar;

            2.设置toolbar的基本属性;

            3.Activity中进行相关设置。

ToolBar基本方法:1.supportRequestWindowFeature(Window.FEATURE_NO_TITLE);去掉标题栏;

  •               2.Toolbar.setLogo(),设置logo图片;

  •               3.Toolbar.setTitle().设置标题;

    •        4.Toolbar.setSubTitle()设置子标题;

              5.Toolbar.setTitleTextColor(int color);设置标题文字颜色;

  •               6.Toolbar.setSubtitleTextColor();设置子标题文字颜色;

  •               7.setTitleMargin(int start, int top, int end, int bottom);设置标题margin值;          8.onCreateOptionsMenu,getMenuInflater().inflate(R.menu.menu,menu)

  • 设置菜单在给Toolbar设置为actionbar时使用;

  •               9.Toolbar.setOnMenuItemClickListener();Toolbar绑定menu监听;

  •               10.Toolbar.inflateMenu(R.menu.menu)在Toolbar没有替换actionbar时使用;

  •               11.setSupportActionBar(mToolbar);设置toolbar替换actionbar;

  •              12.getLayoutInflater().inflate(R.layout.view_tv,bar);Toolbar添加自定义view

  •               13.Menu下的showAsAction属性:alaways:这个值会使菜单项一直显示在ActionBar上,ifRoom:如果有足够的空间,这个值会使菜单显示在ActionBar上,never:这个值菜单永远不会出现在ActionBar上,withText:这个值使菜单和它的图标,菜单文本一起显示

DrawerLayout基本方法

                  1.Drawerlayout.setDrawerLockMode()设置Drawerlayout模式:DrawerLayout.LOCK_MODE_LOCKED_CLOSED关闭手势,LOCK_MODE_UNLOCKED开启手势;

               2.DrawerLayout.isDrawerOpen(Gravity.LEFT)是否开启;

               3.DrawerLayout.openDrawer(Gravity.LEFT);开启抽屉

               4.DrawerLayout.closeDrawer(Gravity.RIGHT);关闭抽屉

代码如下:

package com.huluobo.lc.a1609a_designdemo;

import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.design.widget.NavigationView;
import android.support.design.widget.Snackbar;
import android.support.design.widget.TabLayout;
import android.support.design.widget.TextInputLayout;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.support.v4.widget.DrawerLayout;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.text.Editable;
import android.text.TextUtils;
import android.text.TextWatcher;
import android.view.LayoutInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.Toast;

import java.util.ArrayList;
import java.util.List;

public class MainActivity extends AppCompatActivity {
   
    private NavigationView navigationView;
    private DrawerLayout drawerLayout;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.contant);

        //NavigationView
        drawerLayout = findViewById(R.id.drawerLayout);
        navigationView = findViewById(R.id.navigationview);
        setupDrawerContent(navigationView);

    }

    private void setupDrawerContent(NavigationView navigationView) {
        navigationView.setNavigationItemSelectedListener(new NavigationView
                .OnNavigationItemSelectedListener() {
            @Override
            public boolean onNavigationItemSelected(@NonNull MenuItem menuItem) {
                menuItem.setCheckable(true);
                drawerLayout.closeDrawers();//设置左方抽屉关闭
                Snackbar.make(ll, "id:" + menuItem.getTitle(), Snackbar.LENGTH_INDEFINITE).show();
                return true;
            }
        });
    }
}

SurfaceView简介:

       1.如果需要在另外的线程绘制界面、需要迅速的更新界面,或者渲染UI界面 需要较长的时间,这种情况就要使用SurfaceView了。SurfaceView中包含一个Surface对象,而Surface是可以在后台线程中绘制的。

SurfaceView生命周期:

        surfaceCreated 当SurfaceHolder被创建的时候回调

       surfaceChanged当SurfaceHolder的尺寸发生变化的时候被回调

       surfaceDestroyed 当SurfaceHolder被销毁的时候回调

SurfaceView与View区别:

        View 主要适用于主动更新的情况,而 surfaceView 主要适用于被动更新,

        例如频繁的刷新。

        View 在主线程中对画面进行刷新,而 surfaceView 通常会通过一个子线程

        来进行页面的刷新

        View 在绘图时没有使用双缓冲机制,而 surfaceView 在底层实现机制上就

        已经实现了双缓冲机制

SurfaceView常用方法:

           getHolder():获取surfaceholder对象

         Paint.ANTI_ALIAS_FLAG:抗锯齿

         Paint.setColor(int color):设置颜色

         Paint.setStrokeWidth(int p):设置描边宽度

         Canvas.drawColor(Color color):画布绘制颜色

           Canvas.drawLine(float startX, float startY, float stopX, float stopY,

        @NonNull Paint paint)

方法

作用

备注

moveTo

移动起点

移动下一次操作的起点位置

lineTo

连接直线

连接上一个点到当前点之间的直线

setLastPoint

设置终点

重置最后一个点的位置

close

闭合路劲

从最后一个点连接最初的一个点,形成一个闭合区域

addRect

添加矩形

添加矩形到当前Path

addRoundRect

添加圆角矩形

添加圆角矩形到当前Path

addOval

添加椭圆

添加椭圆到当前Path

addCircle

添加圆

添加圆到当前Path

addPah

添加路劲

添加路劲到当前Path

addArc

添加圆弧

添加圆弧到当前Path

arcTo

圆弧

绘制圆弧,注意和addArc的区别

isEmpty

是否为空

判定Path是否为空

isRect

是否为矩形

判定Path是否是一个矩形

set

替换路劲

用新的路劲替换当前路劲的所有内容

offset

偏移路劲

对当前的路劲进行偏移

quadTo

贝塞尔曲线

二次贝塞尔曲线的方法

cubicTo

贝塞尔曲线

三次贝塞尔曲线的方法

rMoveTo,rlineTo,rQuadTo,rCubicTo

rXxx方法

不带r的方法是基于原点坐标系(偏移量),带r的基于当前点坐标系(偏移量)

op

布尔操作

对两个Path进行布尔运算(交集,并集)等操作

HTTP协议:

            超文本传输协议(HTTP,HyperText Transfer Protocol)是互联网上应用最为广泛的一种网络协议。所有的WWW文件都必须遵守这个标准。设计HTTP最初的目的是为了提供一种发布和接收HTML页面的方法。1960年美国人Ted Nelson构思了一种通过计算机处理文本信息的方法,并称之为超文本(hypertext),这成为了HTTP超文本传输协议标准架构的发展根基。Ted Nelson组织协调万维网协会(World Wide Web Consortium)和互联网工程工作小组(Internet Engineering Task Force )共同合作研究,最终发布了一系列的RFC,其中著名的RFC 2616定义了HTTP 1.1。

HTTP协议会话方式:

1建立tcp连接

2发出请求文档

3发出响应文档

4释放tcp连接

HTTP1.0与1.1区别:

     HTTP 1.0规定浏览器与服务器只保持短暂的连接,浏览器的每次请求都需要与服务器建立一个TCP连接,服务器完成请求处理后立即断开TCP连接,服务器不跟踪每个客户也不记录过去的请求。

HTTP 1.1则支持持久连接Persistent Connection, 并且默认使用persistent connection. 在同一个tcp的连接中可以传送多个HTTP请求和响应. 多个请求和响应可以重叠,多个请求和响应可以同时进行. 更加多的请求头和响应头(比如HTTP1.0没有host的字段).

HTTP请求行与请求内容:

         

HTTP 7种请求方式:

1、opions返回服务器针对特定资源所支持的HTML请求方法或web服务器发送*测试服务器功能(允许客户端查看服务器性能)

2、Get向特定资源发出请求(请求指定页面信息,并返回实体主体)

3、Post向指定资源提交数据进行处理请求(提交表单、上传文件),又可能导致新的资源的建立或原有资源的修改

4、Put向指定资源位置上上传其最新内容(从客户端向服务器传送的数据取代指定文档的内容)

5、Head与服务器索与get请求一致的相应,响应体不会返回,获取包含在小消息头中的原信息(与get请求类似,返回的响应中没有具体内容,用于获取报头)

6、Delete请求服务器删除request-URL所标示的资源*(请求服务器删除页面)

7、Trace回显服务器收到的请求,用于测试和诊断

GET与POST区别(*****):

GET在浏览器回退时是无害的,而POST会再次提交请求。

GET产生的URL地址可以被Bookmark,而POST不可以。

GET请求会被浏览器主动cache,而POST不会,除非手动设置。

GET请求只能进行url编码,而POST支持多种编码方式。

GET请求参数会被完整保留在浏览器历史记录里,而POST中的参数不会被保留。

GET传送的数据量较小,不能大于2KB。post传送的数据量较大,一般被默认为不受限制。但理论上,IIS4中最大量为80KB,IIS5中为100KB。 post基本没有限制,上传文件,都是用post方式的。只不过要修改form里面的那个type参数对参数的数据类型,GET只接受ASCII字符,而POST没有限制。

GET比POST更不安全,因为参数直接暴露在URL上,所以不能用来传递敏感信息。

GET参数通过URL传递,POST放在Request body中。

发布了13 篇原创文章 · 获赞 4 · 访问量 1386

猜你喜欢

转载自blog.csdn.net/weixin_44810052/article/details/89160532