Android 开发经常用到,容易忘记的技巧-总结

1:设置滑动到边缘时无效果模式:

android:overScrollMode="never"

设置不显示滚动条:

android:scrollbars="none"

2:隐藏输入键盘

mIPAddEdit.setInputType(InputType.TYPE_NULL);

3:隐藏键盘但是保留输入光标

if (getActivity() != null){
    getActivity().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
}
mIPAddEdit.setShowSoftInputOnFocus(false);

4:selector 选择状态,将正常顺序放在最后面

例如:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_pressed="true">
        <shape>
            <solid android:color="#DBF1FF"/>
        </shape>
    </item>
    <item >
        <shape>
            <solid android:color="@android:color/white"/>
            <stroke android:width="@dimen/px_1" android:color="#E9EBF3"/>
        </shape>
    </item>
</selector>

5:大部分app 只隐藏状态栏,不隐藏底部操作栏,所以只考虑4.4以上将状态栏隐藏

getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
        WindowManager.LayoutParams.FLAG_FULLSCREEN);

6:使用ConstraintLayout 想要获得填充效果需要将款或者高设置为0

<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@color/white"
    android:layout_margin="@dimen/px_32"
    android:layout_gravity="center">
<Button
    android:id="@+id/zero"
    style="@style/Key_board_keyStyle_Small"
    android:layout_height="0dp"
    android:layout_marginTop="@dimen/px_3"
    android:layout_width="0dp"
    android:text="0"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintEnd_toEndOf="@id/nine"
    app:layout_constraintTop_toBottomOf="@+id/seven"
    app:layout_constraintBottom_toBottomOf="parent"/>
</android.support.constraint.ConstraintLayout>

7:CardView 阴影显示不出来的时候使用

app:cardUseCompatPadding="true"

evelation 这个属性用于背景色不为透明时才有效果

8:progressbar 进度条颜色 

mLoading_progress.setIndeterminateDrawable(mContent.getResources().getDrawable(R.drawable.progress_bar));
<?xml version="1.0" encoding="utf-8"?>
<animated-rotate xmlns:android="http://schemas.android.com/apk/res/android"
    android:pivotX="50%"
    android:pivotY="50%"
    android:fromDegrees="0"
    android:duration="2000"
    android:toDegrees="360">

    <shape
        android:shape="ring"
        android:innerRadiusRatio="3"
        android:thicknessRatio="8"
        android:useLevel="false">
        <gradient
            android:type="sweep"
            android:useLevel="false"
            android:startColor="#ffffff"
            android:centerColor="#ccd800"
            android:centerY="0.50"
            android:endColor="#ffd800" />

    </shape>
</animated-rotate>

9:android editText 下滑线 颜色变化,使用setBackgroundTintList 设置不同颜色与状态

@Override
public void setError(CharSequence error) {
   setHintTextColor(Color.RED);
   setText("");
   setHint(error);
    states[0] = new int[] { android.R.attr.state_focused};
    states[1] = new int[] { android.R.attr.state_enabled};
    setBackgroundTintList(new ColorStateList(states,mErrorColors));
}

10.Edittext 不自动弹出软键盘

父布局中加入下面两句

android:focusable="true"
android:focusableInTouchMode="true"

11.popupwindow 中

.添加阴影需要设置一个带颜色的window 背景, 设置宽高自适应宽高

mPopWindow.setWidth(ViewGroup.LayoutParams.WRAP_CONTENT);
mPopWindow.setHeight(ViewGroup.LayoutParams.WRAP_CONTENT);
mPopWindow.setBackgroundDrawable(getResources().getDrawable(R.drawable.shape_order_detail_menu));

12.gridelayout 写键盘时 占用3行 需要加上layout_gravity="fill"

<Button
    android:id="@+id/confirm"
    style="@style/Key_board_keyStyle_Small"
    android:background="@drawable/selector_key_board_enter"
    android:layout_rowSpan="3"
    android:layout_gravity="fill"
    android:text="确定"/>

13.android 图像混合模式的关键点

1:图像混合模式使用需要两个Bitmap对象 ,是两个图像的混合;

2:自定义view 中需要创建新的透明图层给图像进行混合如下

int saveCount = canvas.saveLayer(null, mPaint, Canvas.ALL_SAVE_FLAG);
canvas.restoreToCount(saveCount);

完整代码如下:

    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        //将绘制操作保存到新的图层,因为图像合成是很昂贵的操作,将用到硬件加速,这里将图像合成的处理放到离屏缓存中进行
        int saveCount = canvas.saveLayer(null, mPaint, Canvas.ALL_SAVE_FLAG);
        //绘制目标图
        canvas.drawBitmap(mDstBitmap,0,0,mPaint);
        //设置混合模式
        mPaint.setXfermode(xfermode);
        //绘制源图
        canvas.drawBitmap(mSrcBitmap,0,0,mPaint);
        //清除混合模式
        mPaint.setXfermode(null);
        //还原画布
        canvas.restoreToCount(saveCount);
    }

14: 使用camera2注意事项:

1.获取nv21

    private static byte[] YUV_420_888toNV21(Image image,byte[] nv21) {
        ByteBuffer yBuffer = image.getPlanes()[0].getBuffer();
//        ByteBuffer uvBuffer = image.getPlanes()[1].getBuffer();//y12
        ByteBuffer vuBuffer = image.getPlanes()[2].getBuffer();//nv21

        int ySize = yBuffer.remaining();
        int vuSize = vuBuffer.remaining();

        //U and V are swapped
        yBuffer.get(nv21, 0, ySize);
        vuBuffer.get(nv21, ySize, vuSize);
        return nv21;
    }

2.通过textrureview 的buffer大小设置预览大小

15:设备唯一序列号

public static String getDeviceSNX(){
    String serialNumber = android.os.Build.SERIAL;
    return serialNumber;
}

public static String getDeviceSN(){
    String serial = null;
    try {
        Class<?> c =Class.forName("android.os.SystemProperties");
        Method get =c.getMethod("get", String.class);
        serial = (String)get.invoke(c, "ro.serialno");
    } catch (Exception e) {
        e.printStackTrace();
    }
    return serial;
}

16:recyclerview 加载数据后不从顶部显示

1:focus 竞争问题,在顶部 

android:descendantFocusability="" 

2:layoutmanage 问题

mLayoutManager.setReverseLayout(false);

17:获取系统中定义的系统资源ID的方法

private int getStatusBarHeight(){
   int statusBarHeight = -1;
   int resourceId = getResources().getIdentifier("status_bar_height", "dimen", "android");
   if (resourceId > 0) {
      //根据资源ID获取响应的尺寸值
      statusBarHeight = getResources().getDimensionPixelSize(resourceId);
   }
   return statusBarHeight;
}

18:打印provider 

    private void printDataByUri(ContentResolver resolver,Uri uri){
        Cursor cursor = resolver.query(uri,null,null,null,null);
        LogHelper.e(TAG,"===== insert mUri:"+ uri +" count:"+cursor.getCount());
        StringBuilder sb = new StringBuilder();
        for (int i = 0;i < cursor.getCount();i++){
            for (int j = 0;j < cursor.getColumnCount();j++){
                cursor.moveToPosition(i);
                int index = cursor.getColumnIndex(cursor.getColumnName(j));
                int type = cursor.getType(index);
                sb.append(cursor.getColumnName(j));
                sb.append(":");
                switch (type){
                    case FIELD_TYPE_STRING:
                        sb.append(cursor.getString(index));
                        break;
                    case FIELD_TYPE_INTEGER:
                        sb.append(cursor.getInt(index));
                        break;
                    case FIELD_TYPE_FLOAT:
                        sb.append(cursor.getFloat(index));
                        break;
                    case FIELD_TYPE_BLOB:
                        sb.append(String.valueOf(cursor.getBlob(index)));
                        break;
                    case FIELD_TYPE_NULL:
                        sb.append(": null");
                        break;
                }
                sb.append("\n");

            }
        }
        LogHelper.e(TAG,"===== insert mUri:"+ uri +" data:"+sb.toString());
        cursor.close();
    }

 

20中文排序

public int compare(ImageFile me, ImageFile other) {
    if(me.getFileName().equals(other.getFileName()))return 0;
    return comp(me.getFileName(), other.getFileName());
}

private int comp(String str1, String str2){
    if(str1.charAt(0) == str2.charAt(0)){
        if(str1.length()>1 && str2.length()>1) {
            return comp(str1.substring(1,str1.length()), str2.substring(1, str2.length()));
        }
    }
    char[] c={str1.toLowerCase().charAt(0),str2.toLowerCase().charAt(0)};
    String[] str={str1.substring(0, 1),str2.substring(0, 1)};
    int type[]={1,1};
    for(int i=0;i<2;i++)
    {
        if(str[i].matches("[\\u4e00-\\u9fbb]+"))
            type[i]=1;
        else if(c[i]>='a' && c[i]<='z')
            type[i]=2;
        else if(c[i]>='0' && c[i]<='9')
            type[i]=3;
        else
            type[i]=4;
    }
    if(type[0]==1 && type[1]==1)
        return Collator.getInstance(java.util.Locale.CHINESE).compare(str1, str2);
    if(type[0]==type[1])
        return str1.compareTo(str2);
    return type[0]-type[1];
}

21 资源匹配具体文件夹和具体高度drawable-sw320dp-385x320(优先匹配sw320dp 其次大的在前小的在后) 匹配具体高度drawable-h337dp 匹配高度是display.getsize 不包含系统view 的显示高度非屏幕高度

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值