随笔记:记一次安卓开发中常用到的插件以及踩过的坑

版权声明:本文为博主原创文章,转载请注明出处! https://blog.csdn.net/ChenMMo/article/details/81209684

整合一些安卓开发中一些小白问题,以及常用的插件

隐藏标题栏

继承AppCompatActivity类
有两种方式
1.在 setContentView();之前设置 getSupportActionBar().hide();

2.在文件AndroidManifest.xml 设置android:theme=”@style/Theme.AppCompat.Light.NoActionBar”
个人更偏向于第二种方式。因为第一种方式可能在启动其他Activity 收到返回值的时候 恢复标题栏

设置状态栏颜色

有时候有需求,就是状态栏要改变颜色,实现沉浸式的体验效果。
在setContentView();之后设置如下代码

 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            Window window = getWindow();
            //设置修改状态栏
            window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
            //设置状态栏的颜色,和你的app主题或者标题栏颜色设置一致就ok了
            window.setStatusBarColor(getResources().getColor(R.color.bgblue));
   }

发送验证码 倒计时
这个简单,实际上就是写个线程。去循环 去睡眠。然后 隔1S通知主线程一次,主线程收到通知后更改倒计时

     new Thread() {
                @Override
                public void run() {
                      for (int i = 90; i >= 0; i--) {
                          Message msg = new Message();
                          msg.what = 0x0001;
                          msg.arg1 = i;
                          handler.sendMessage(msg);
                          try {
                               Thread.sleep(1000);
                          } catch (InterruptedException e) {
                               e.printStackTrace();
                         }
                       }
                 }
      }.start();

 Handler handler = new Handler(){
        @Override
        public void handleMessage(Message msg) {
            if(msg.what==0x0001){
                if (msg.arg1 > 0) {
                    sendsms.setText("已发送:" + msg.arg1);
                } else {
                    sendsms.setText("获取验证码");
                }

            }
        }
    };

一个帮助类 原生json 转对象 帮助类

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import org.json.JSONTokener;

import java.lang.reflect.Field;
import java.sql.Connection;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
/**
 * Created by JZD on 2018/6/24.
 */

public class JsonUtil {
    public static Map<String, Object> JsonObjectToMap(JSONObject jsonResult) throws JSONException {
        Map<String, Object> result = new HashMap<String, Object>();
        if(jsonResult!=null) {
            Iterator<String> keyIt = jsonResult.keys();
            while (keyIt.hasNext()) {
                String key = keyIt.next();
                Object val = jsonResult.get(key);
                if(val!=null){
                    if (val instanceof JSONObject) {
                        Map<String, Object> valMap = JsonObjectToMap((JSONObject) val);
                        result.put(key, valMap);
                    }else if (val instanceof JSONArray) {
                        JSONArray ja = (JSONArray) val;
                        result.put(key, JsonArrayToList(ja));
                    }else {
                        result.put(key, val);
                    }
                }else {
                    result.put(key, null);
                }
            }
        }
        return result;
    }
    public static List<Object> JsonArrayToList(JSONArray jsonArray) throws JSONException {
        List<Object> list = new ArrayList<Object>();
        if(jsonArray!=null){
            for (int i = 0; i < jsonArray.length(); i++) {
                Object val = jsonArray.get(i);
                if(val!=null){
                    if (val instanceof JSONObject) {
                        Map<String, Object> map = JsonObjectToMap((JSONObject) val);
                        list.add(map);
                    }else if(val instanceof JSONArray){
                        list.add(JsonArrayToList((JSONArray) val));
                    }else {
                        list.add(val);
                    }
                }
            }
        }
        return list;
    }
    public static int getType(Class<?> type)
    {
        if(type!=null&&(String.class.isAssignableFrom(type)||Character.class.isAssignableFrom(type)||Character.TYPE.isAssignableFrom(type)||char.class.isAssignableFrom(type)))
            return 0;
        if(type!=null&&(Byte.TYPE.isAssignableFrom(type)||Short.TYPE.isAssignableFrom(type)||Integer.TYPE.isAssignableFrom(type)||Integer.class.isAssignableFrom(type)||Number.class.isAssignableFrom(type)||int.class.isAssignableFrom(type)||byte.class.isAssignableFrom(type)||short.class.isAssignableFrom(type)))
            return 1;
        if(type!=null&&(Long.TYPE.isAssignableFrom(type)||long.class.isAssignableFrom(type)))
            return 2;
        if(type!=null&&(Float.TYPE.isAssignableFrom(type)||float.class.isAssignableFrom(type)))
            return 3;
        if(type!=null&&(Double.TYPE.isAssignableFrom(type)||double.class.isAssignableFrom(type)))
            return 4;
        if(type!=null&&(Boolean.TYPE.isAssignableFrom(type)||Boolean.class.isAssignableFrom(type)||boolean.class.isAssignableFrom(type)))
            return 5;
        if(type!=null&&type.isArray())
            return 6;
        if(type!=null&&Connection.class.isAssignableFrom(type))
            return 7;
        if(type!=null&&JSONArray.class.isAssignableFrom(type))
            return 8;
        if(type!=null&&List.class.isAssignableFrom(type))
            return 9;
        if(type!=null&&Map.class.isAssignableFrom(type))
            return 10;
        return 11;
    }
    public static Object JsonObjectToObject(JSONObject obj,Field field) throws JSONException{
        switch (getType(field.getType()))//field.getType:获取属性声明时类型对象(返回class对象)
        {
            case 0:
                return obj.opt(field.getName());
            case 1:
                return obj.optInt(field.getName());
            case 2:
                return obj.optLong(field.getName());
            case 3:
            case 4:
                return obj.optDouble(field.getName());
            case 5:
                return obj.optBoolean(field.getName());
            case 6:
            case 7:
            case 8://JsonArray型
                return obj.optJSONArray(field.getName());
            case 9:
                return JsonArrayToList(obj.optJSONArray(field.getName()));
            case 10:
                return JsonObjectToMap(obj.optJSONObject(field.getName()));
            default:
                return null;
        }
    }
    public static Object MapToObject(Object obj, Map<?, ?> map) throws IllegalAccessException{
        Field[] fields= obj.getClass().getDeclaredFields();
        for (Field field : fields) {
            field.setAccessible(true);
            field.set(obj,map.get(field.getName()));
        }
        return obj;
    }
    public static String toJson(Object obj)throws IllegalAccessException,JSONException
    {
        JSONObject json=new JSONObject();
        Field[] fields = obj.getClass().getDeclaredFields();
        for (Field field : fields) {
            switch(getType(field.getType()))
            {
                case 0:
                    json.put(field.getName(),(field.get(obj)==null?"":field.get(obj)));
                    break;
                case 1:
                    json.put(field.getName(),(int)(field.get(obj)==null?0:field.get(obj)));
                    break;
                case 2:
                    json.put(field.getName(),(long)(field.get(obj)==null?0:field.get(obj)));
                    break;
                case 3:
                    json.put(field.getName(),(float)(field.get(obj)==null?0:field.get(obj)));
                    break;
                case 4:
                    json.put(field.getName(),(double)(field.get(obj)==null?0:field.get(obj)));
                    break;
                case 5:
                    json.put(field.getName(),(boolean)(field.get(obj)==null?false:field.get(obj)));
                    break;
                case 6:
                case 7:
                case 8://JsonArray型
                    json.put(field.getName(),(field.get(obj)==null?null:field.get(obj)));
                    break;
                case 9:
                    json.put(field.getName(),  new JSONArray((List<?>)field.get(obj)));
                    break;
                case 10:
                    json.put(field.getName(),new  JSONObject((HashMap<?, ?>)field.get(obj)));
                    break;
            }
        }
        return json.toString();
    }
    public static <T> T fromJson(String JsonStr,Class<T> type)throws JSONException,NullPointerException,IllegalAccessException, InstantiationException{
        if(JsonStr ==null||JsonStr.equals("")) {
            throw new NullPointerException("JsonString can't be null");
        }
        T data = type.newInstance();;
        Field[] fields= type.getDeclaredFields();
        JSONObject jsonObject=(JSONObject)new JSONTokener(JsonStr).nextValue();
        for (Field field : fields) {
            field.setAccessible(true);
            field.set(data,JsonObjectToObject(jsonObject, field));
        }
        return data;
    }
}

弧形图片 如图
这里写图片描述

这样的 一个图片内凹了一部分 实现方式来自一位大神博客


import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Path;
import android.graphics.Rect;
import android.support.annotation.Nullable;
import android.util.AttributeSet;
import android.view.View;

import com.example.jzd.surname.R;

/**
 * Created by YaoShiHang on 2018/7/11.
 */

public class ArcView extends View {

    private int mWidth;
    private int mHeight;
    /**
     * 弧形高度
     */
    private int mArcHeight;
    /**
     * 背景颜色
     */
    private int mBgColor;
    private Paint mPaint;
    private Context mContext;

    public ArcView(Context context) {
        this(context, null);
    }

    public ArcView(Context context, @Nullable AttributeSet attrs) {
        this(context, attrs, 0);
    }

    public ArcView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);

        TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.ArcView);
        mArcHeight = typedArray.getDimensionPixelSize(R.styleable.ArcView_arcHeight, 0);
        mBgColor=typedArray.getColor(R.styleable.ArcView_bgColor, Color.parseColor("#303F9F"));

        mContext = context;
        mPaint = new Paint();
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);

        mPaint.setStyle(Paint.Style.FILL);
        mPaint.setColor(mBgColor);

        Rect rect = new Rect(0, 0, mWidth, mHeight - mArcHeight);
        canvas.drawRect(rect, mPaint);


        Path path = new Path();
        path.moveTo(0, mHeight - mArcHeight);
        path.quadTo(mWidth / 2, mHeight, mWidth, mHeight - mArcHeight);
        canvas.drawPath(path, mPaint);

    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
        int widthSize = MeasureSpec.getSize(widthMeasureSpec);
        int widthMode = MeasureSpec.getMode(widthMeasureSpec);
        int heightSize = MeasureSpec.getSize(heightMeasureSpec);
        int heightMode = MeasureSpec.getMode(heightMeasureSpec);

        if (widthMode == MeasureSpec.EXACTLY) {
            mWidth = widthSize;
        }
        if (heightMode == MeasureSpec.EXACTLY) {
            mHeight = heightSize;
        }
        setMeasuredDimension(mWidth, mHeight);
    }

}

给按钮设置圆角
实际上是给了一个资源文件作为背景。资源文件里定义了弧形 弧度

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle">
     <solid android:color="#d24b3c" /><!-- 填充的颜色 -->
      <!-- 设置按钮的四个角为弧形 -->
      <!-- android:radius 弧形的半径 -->
      <corners android:topLeftRadius="10dp"
            android:topRightRadius="10dp"
            android:bottomRightRadius="10dp"
            android:bottomLeftRadius="10dp"/>
      <!-- 边框粗细及颜色 -->
      <stroke android:width="2dp" android:color="#d24b3c" />
</shape>

直接拨打电话

Uri uri = Uri.parse("tel:"+phone);
Intent it = new Intent(Intent.ACTION_DIAL, uri);
startActivity(it);

两个加载 网络图片的插件

操作 ImageView 加载网络图片
导入依赖

compile 'com.squareup.picasso:picasso:2.5.2'

使用方法

ImageView banner = findViewById(R.id.banner);
Picasso.with(getActivity())
            .load(AppConst.IMGURL)
            .into(banner);

使用Facebook的 fresco 插件加载网络图片
导入依赖 这个东西好玩 能设置圆角图片 我们实际开发中好多用户头像要圆角的

  compile 'com.facebook.fresco:fresco:0.14.1'

布局文件使用

        <com.facebook.drawee.view.SimpleDraweeView
                android:id="@+id/header"
                android:layout_width="64dp"
                android:layout_height="64dp"
                fresco:actualImageScaleType="centerCrop"
                fresco:placeholderImage="@mipmap/default_head"
                fresco:placeholderImageScaleType="fitCenter"
                fresco:roundAsCircle="true"
                fresco:roundedCornerRadius="20dp"
                android:layout_marginTop="44dp"
                android:layout_marginLeft="25dp"
                />

代码中 加载图片

//要进行初始化  在activity的 onCreate方法中设置
  Fresco.initialize(getActivity());
//*****************************************


header = (SimpleDraweeView)view.findViewById(R.id.header);
Uri uri = Uri.parse(AppConst.IMGURL+data.optString("head"));
header.setImageURI(uri);

好多时候要用到轮播图
效果图
这里写图片描述

首先导入依赖

  compile 'com.bigkoo:convenientbanner:2.0.5'
  compile 'com.github.bumptech.glide:glide:3.7.0'

首先看下布局文件

    <com.bigkoo.convenientbanner.ConvenientBanner
            android:id="@+id/my_banner"
            android:layout_width="match_parent"
            android:layout_height="85dp"/>

代码中加载轮播图 这里用到了2个资源文件 为选中和未选中的样式。 可以随便找合适的图片替代

private ConvenientBanner mCb;
mCb = (ConvenientBanner) view.findViewById(R.id.my_banner);

// 加载轮播图
mCb.setPages(new CBViewHolderCreator<NetworkImageHolderView>() {
       @Override
        public NetworkImageHolderView createHolder() {
               return new NetworkImageHolderView();
         }
}, mImageList)
          .setPageIndicator(new int[]{R.drawable.ponit_normal, R.drawable.point_select}) //设置两个点作为指示器
          .setPageIndicatorAlign(ConvenientBanner.PageIndicatorAlign.CENTER_HORIZONTAL); //设置指示器的方向水平居中

猜你喜欢

转载自blog.csdn.net/ChenMMo/article/details/81209684