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 的显示高度非屏幕高度