这几天做一个自定义相机界面,发现相机老是被拉伸,于是自己想了一个自动选择最佳的尺寸,计算要求如下:
1.尺寸越大越好,2.宽高比越接近越好
标准化尺寸和比例至0-1
最佳的总分=尺寸标准化的值*0.1+比例标准化的值*1
为什么*0.1呢?因为比例是最影响变形的因素,而尺寸对于变形来说基本没有影响,如果比0.1大,会比较明显的印象最终结果,所以选择一个0.1对变形影响比较少:
最终计算方法:
/**
* size 是横向计算的,height比width大
* @param supportedSizes
* @param w
* @param h
* @return
*/
private static Camera.Size getMaxSize (List<Camera.Size> supportedSizes,int w,int h) {
LogUtil.showlog("getsize:" + w + "*" + h);//480*800
//获取预览的各种分辨率
Camera.Size max = null;
double maxSize=0,minSize=Integer.MAX_VALUE;
double maxFit=0,minFix=Double.MAX_VALUE;
for (Camera.Size size :supportedSizes) {
double tagSize = size.height*1d*size.width;//越大越好
if (tagSize>maxSize) {
maxSize = tagSize;
}
if (tagSize<minSize) {
minSize = tagSize;
}
double tagFit = Math.abs(size.height*1d/size.width-h*1d/w);//越小越好
LogUtil.showlog("tagFix:" + tagFit);
if (tagFit>maxFit) {
maxFit=tagFit;
}
if (tagFit<minFix) {
minFix = tagFit;
}
}
// LogUtil.showlog("最大尺寸:" + max.width + "*" + max.height);
for (Camera.Size size :supportedSizes) {
double tagSize = size.height*1d*size.width;
double sizeScore = (tagSize-minSize)*1d/(maxSize-minSize);
// double tagFix = size.height*1d/size.width;
double tagFix = Math.abs(size.height*1d/size.width-h*1d/w);
double fixScore = (tagFix-minFix)*1d/(maxFit-minFix);
if (max==null) {
max = size;
} else {
double bSize = max.height*1d*max.width;
double bestSize = (bSize-minSize)*1d/(maxSize-minSize);
// double bFix = max.height/max.width;
double bFix = Math.abs(max.height*1d/max.width-h*1d/w);
double bestFix = (bFix-minFix)*1d/(maxFit-minFix);
LogUtil.showlog("=========");
LogUtil.showlog("匹配w*h:" + size.width + "*" + size.height);
LogUtil.showlog("目标尺寸分值:" + sizeScore);
LogUtil.showlog("目标吻合分值:" + fixScore);
LogUtil.showlog("最优尺寸分值:" + bestSize);
LogUtil.showlog("最优吻合分值:" + bestFix);
if (sizeScore*0.1+(1-fixScore) > bestSize*0.1+(1-bestFix)) {
if (max.height<h && max.width<w) {
max = size;
}
}
}
}
LogUtil.showlog("最合适的尺寸:" + max.width + "*" + max.height);
return max;
}后来也在网上看见的一个计算相机预览时的最佳分辨率:
/**
* 获取最适合屏幕的照片 尺寸
*
* @param sizes
* @param w
* @param h
* @return
*/
private static Camera.Size getOptimalPreviewSize(List<Camera.Size> sizes, int w, int h) {
final double ASPECT_TOLERANCE = 0.1;
double targetRatio = (double) w / h;
if (sizes == null)
return null;
Camera.Size optimalSize = null;
double minDiff = Double.MAX_VALUE;
int targetHeight = h;
// Try to find an size match aspect ratio and size
for ( Camera.Size size : sizes) {
double ratio = (double) size.width / size.height;
if (Math.abs(ratio - targetRatio) > ASPECT_TOLERANCE)
continue;
if (Math.abs(size.height - targetHeight) < minDiff) {
optimalSize = size;
minDiff = Math.abs(size.height - targetHeight);
}
}
// Cannot find the one match the aspect ratio, ignore the requirement
if (optimalSize == null) {
minDiff = Double.MAX_VALUE;
for (Camera.Size size : sizes) {
if (Math.abs(size.height - targetHeight) < minDiff) {
optimalSize = size;
minDiff = Math.abs(size.height - targetHeight);
}
}
}
return optimalSize;
}经过两个算法计算,将最好的尺寸设置进相机
parameters.setPictureSize(size.w,size.h);发现还是变形,最终选择不设置参数,用系统默认的。
SwipeRefreshLayout使用方法:
http://www.apkbus.com/android-166418-1-1.html
SwipeRefreshLayout是V4包得其中一个类
swipeLayout = (SwipeRefreshLayout) findViewById(R.id.swipe_container);
swipeLayout.setOnRefreshListener(this);
swipeLayout.setColorScheme(android.R.color.holo_blue_bright,
android.R.color.holo_green_light,
android.R.color.holo_orange_light,
android.R.color.holo_red_light);
}
public void onRefresh() {
new Handler().postDelayed(new Runnable() {
[url=home.php?mod=space&uid=389554]@Override[/url] public void run() {
swipeLayout.setRefreshing(false);
}
}, 5000);
}
仿开源中国api包内容的网络访问结构
最近项目功能渐渐的多了起来,接口的访问重复次数越来越多,为了防止以后接口改动app要修改多出,想起了开源中国的api包,于是,自己也写了一个api包,如下:
public class DynamicApi extends BaseApi {
public DynamicApi(Context context, String falg, NetAccess.NetAccessListener listener) {
super(context, falg, listener);
}
public static DynamicApi init (Context context,String flag,NetAccess.NetAccessListener listener) {
return new DynamicApi(context,flag,listener);
}<span style="white-space:pre"> </span>/**
<span style="white-space:pre"> </span>删除动态
**/
public void delDynam (boolean isClass,int dyid) {
// 删除动态
HashMap<String, String> params2 = new HashMap<String, String>();
params2.put("dyid", "" + dyid);
params2.put("isclass",isClass+"");
params2 = RequestUtil.parse(mContext, params2);
NetAccess.request(mContext)
.setFlag(mFlag)
.setParams(params2)
.byPost(Global.Urls.delDym,
mListener);
}}
使用:
DynamicApi.init(context,"del",Mainactivity.this).delDynam(true,1);