Android 开发中的代码片段(1)
前言
收集Android开发中常用的一些代码片段,留存记录
代码
禁止截屏
对安全性要求比较高的APP可以用得到
getWindow().addFlags(WindowManager.LayoutParams.FLAG_SECURE)
禁止输入特殊字符
经历过 Tester 的无限摧残得出的结果,主要是使用正则表达式来完成校验。
/**
* 禁止输入表情以及特殊字符
*/
public static class EmojiExcludeFilter implements InputFilter {
@Override
public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {
for (int i = start; i < end; i++) {
int type = Character.getType(source.charAt(i));
if (type == Character.SURROGATE || type == Character.OTHER_SYMBOL) {
return "";
}
}
String speChat = "[`~!@#$%^&*()+=|{}':;'\\[\\].<>/?~!@#¥%……&*()——+|{}【】‘”“’?]";
Pattern pattern = Pattern.compile(speChat);
Matcher matcher = pattern.matcher(source.toString());
if (matcher.find()) {
return "";
} else {
return null;
}
}
}
调用如下:
edtRemark.setFilters(new InputFilter[]{new UIHelper.EmojiExcludeFilter()});
ViewPager无限滑动
用来做轮播图(Banner)会用得到。
mViewPager.setOnPageChangeListener(new OnPageChangeListener() {
@Override
public void onPageSelected(int arg0) {
}
@Override
public void onPageScrolled(int arg0, float arg1, int arg2) {
if(arg0 == 0 && (arg1 <= 0.001f && arg1 >= -0.001f)){
mVp.setCurrentItem(list.size()-2, false);
}else if(arg0 == list.size() - 1){
mVp.setCurrentItem(1, false);
}
}
@Override
public void onPageScrollStateChanged(int arg0) {
}
});
判断ViewPager的滑动方向
vp.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
float lastPositionOffset = 0L;
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
if (lastPositionOffset > positionOffset && positionOffset != 0) {
//右滑
Log.e("direction", "right");
} else if (lastPositionOffset < positionOffset && positionOffset != 0) {
//左滑
Log.e("direction", "left");
}
lastPositionOffset = positionOffset;
}
@Override
public void onPageSelected(int position) { }
@Override
public void onPageScrollStateChanged(int state) {}
});
根据百分比计算颜色值
/**
* 根据当前的百分比 计算两个颜色之间的值
*
* @param fraction 分值
* @param startValue 开始颜色
* @param endValue 结束颜色
* @return 计算得出的颜色
*/
public static Integer evaluate(float fraction, Integer startValue, Integer endValue) {
float[] startHsv = new float[3];
float[] endHsv = new float[3];
float[] outHsv = new float[3];
// 把 ARGB 转换成 HSV
Color.colorToHSV(startValue, startHsv);
Color.colorToHSV(endValue, endHsv);
// 根据当前的百分比(fraction)所对应的颜色值
if (endHsv[0] - startHsv[0] > 180) {
endHsv[0] -= 360;
} else if (endHsv[0] - startHsv[0] < -180) {
endHsv[0] += 360;
}
outHsv[0] = startHsv[0] + (endHsv[0] - startHsv[0]) * fraction;
if (outHsv[0] > 360) {
outHsv[0] -= 360;
} else if (outHsv[0] < 0) {
outHsv[0] += 360;
}
outHsv[1] = startHsv[1] + (endHsv[1] - startHsv[1]) * fraction;
outHsv[2] = startHsv[2] + (endHsv[2] - startHsv[2]) * fraction;
// 根据当前的百分比(fraction)所对应的透明度
int alpha = startValue >> 24 + (int) ((endValue >> 24 - startValue >> 24) * fraction);
// 把 HSV 转换回 ARGB 返回
return Color.HSVToColor(alpha, outHsv);
}
ViewPager之间联动
//-----------------------------联动 下面的内容
int width = vpContent.getWidth();
//滑动内部Viewpager
vpContent.scrollTo((int) (width * position + width * positionOffset), 0);
//-----------------------------联动 下面的内容
AlertDialog状态不变黑
主要解决使用AlertDialog状态栏变黑的问题
public class CustomDialog extends AlertDialog {
public CustomDialog(@NonNull Context context) {
super(context);
}
public CustomDialog(@NonNull Context context, @StyleRes int theme) {
super(context, theme);
}
protected CustomDialog(@NonNull Context context, boolean cancelable, OnCancelListener cancelListener) {
super(context, cancelable, cancelListener);
}
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// 请使用自己的工具类获取屏幕的高度
int screenHeight = ScreenUtils.getScreenHeight(getContext());
// 请使用自己的工具类获取到状态栏的高度
int statusBarHeight = ScreenUtils.getStatusHeight(getContext());
int dialogHeight = screenHeight - statusBarHeight;
getWindow().setLayout(ViewGroup.LayoutParams.MATCH_PARENT, dialogHeight);
}
}
判断屏幕旋转方向
// 判断Android当前的屏幕是横屏还是竖屏。横竖屏判断
if (this.getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT) {
//竖屏
} else {
//横屏
}
手动设置方向
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
最后
未完待续、敬请期待!
我的博客地址

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
-
上一篇
android 仿微信表情雨下落!
文章链接:https://mp.weixin.qq.com/s/yQXn-YjEFSW1X7A7CcuaVg 众所周知,微信聊天中我们输入一些关键词会有表情雨下落,比如输入「生日快乐」「么么哒」会有相应的蛋糕、亲吻的表情雨下落,今天就来完成这个表情雨下落的效果。 先来看下效果,真·狗头雨·落! 确认表情的模型,定义属性 public class ItemEmoje { //坐标 public int x; public int y; // 横向偏移 public int offsetX; //纵向偏移 public int offsetY; //缩放 public float scale; //图片资源 public Bitmap bitmap; } 自定义RainView 表情下落视图,初始化变量。 public class RainView extends View { private Paint paint; //图片处理 private Matrix matrix; private Random random; //判断是否运行的,默认没有 private boolean is...
-
下一篇
Android 开发中的代码片段(2)复制对象之间的属性值
前言 开发中会遇到这样的一个情况,我们得到一个dto对象,里面有几十个属性值,需要将这几十个属性值的N个通过VO传输另外一个地方,一般我们的做法是: 创建VO类,new vo() 对象,通过vo.set(dto.get)的方式不断的设置值。 但是这种方式在属性少量的情况之下还是没有问题,但是在属性不断变化的情况下就令人烦恼了,但是我们可以选择使用反射来完成A对象拷贝到B对象的这一过程。 其主要原理是通过反射获取到A对象的get方法和数据类型,然后截取get之后的字符串,拼接成set方法,再通过反射调用B的set方法和传值。 代码 public class CopyPropertiesUtil { /** * 利用反射实现对象之间属性复制 * * @param from * @param to */ public static void copyProperties(Object from, Object to) throws Exception { copyPropertiesExclude(from, to, null); } /** * 复制对象属性 * * @param from...
相关文章
文章评论
共有0条评论来说两句吧...