手机API等级在16以上的,可以用这个方法:
if (VERSION.SDK_INT > 16) {
Bitmap bitmap = sentBitmap.copy(sentBitmap.getConfig(), true);
final RenderScript rs = RenderScript.create(context);
final Allocation input = Allocation.createFromBitmap(rs, sentBitmap, Allocation.MipmapControl.MIPMAP_NONE,
Allocation.USAGE_SCRIPT);
final Allocation output = Allocation.createTyped(rs, input.getType());
final ScriptIntrinsicBlur script = ScriptIntrinsicBlur.create(rs, Element.U8_4(rs));
script.setRadius(radius /* e.g. 3.f */);
script.setInput(input);
script.forEach(output);
output.copyTo(bitmap);
return bitmap;
}
假设手机API等级小于16,那就用这个方法:
@SuppressLint("NewApi")
public static Bitmap fastblur(Context context, Bitmap sentBitmap, int radius) {
Bitmap bitmap = sentBitmap.copy(sentBitmap.getConfig(), true);
if (radius < 1) {
return (null);
}
int w = bitmap.getWidth();
int h = bitmap.getHeight();
int[] pix = new int[w * h];
// Log.e("pix", w + " " + h + " " + pix.length);
bitmap.getPixels(pix, 0, w, 0, 0, w, h);
int wm = w - 1;
int hm = h - 1;
int wh = w * h;
int div = radius + radius + 1;
int r[] = new int[wh];
int g[] = new int[wh];
int b[] = new int[wh];
int rsum, gsum, bsum, x, y, i, p, yp, yi, yw;
int vmin[] = new int[Math.max(w, h)];
int divsum = (div + 1) >> 1;
divsum *= divsum;
int temp = 256 * divsum;
int dv[] = new int[temp];
for (i = 0; i < temp; i++) {
dv[i] = (i / divsum);
}
yw = yi = 0;
int[][] stack = new int[div][3];
int stackpointer;
int stackstart;
int[] sir;
int rbs;
int r1 = radius + 1;
int routsum, goutsum, boutsum;
int rinsum, ginsum, binsum;
for (y = 0; y < h; y++) {
rinsum = ginsum = binsum = routsum = goutsum = boutsum = rsum = gsum = bsum = 0;
for (i = -radius; i <= radius; i++) {
p = pix[yi + Math.min(wm, Math.max(i, 0))];
sir = stack[i + radius];
sir[0] = (p & 0xff0000) >> 16;
sir[1] = (p & 0x00ff00) >> 8;
sir[2] = (p & 0x0000ff);
rbs = r1 - Math.abs(i);
rsum += sir[0] * rbs;
gsum += sir[1] * rbs;
bsum += sir[2] * rbs;
if (i > 0) {
rinsum += sir[0];
ginsum += sir[1];
binsum += sir[2];
} else {
routsum += sir[0];
goutsum += sir[1];
boutsum += sir[2];
}
}
stackpointer = radius;
for (x = 0; x < w; x++) {
r[yi] = dv[rsum];
g[yi] = dv[gsum];
b[yi] = dv[bsum];
rsum -= routsum;
gsum -= goutsum;
bsum -= boutsum;
stackstart = stackpointer - radius + div;
sir = stack[stackstart % div];
routsum -= sir[0];
goutsum -= sir[1];
boutsum -= sir[2];
if (y == 0) {
vmin[x] = Math.min(x + radius + 1, wm);
}
p = pix[yw + vmin[x]];
sir[0] = (p & 0xff0000) >> 16;
sir[1] = (p & 0x00ff00) >> 8;
sir[2] = (p & 0x0000ff);
rinsum += sir[0];
ginsum += sir[1];
binsum += sir[2];
rsum += rinsum;
gsum += ginsum;
bsum += binsum;
stackpointer = (stackpointer + 1) % div;
sir = stack[(stackpointer) % div];
routsum += sir[0];
goutsum += sir[1];
boutsum += sir[2];
rinsum -= sir[0];
ginsum -= sir[1];
binsum -= sir[2];
yi++;
}
yw += w;
}
for (x = 0; x < w; x++) {
rinsum = ginsum = binsum = routsum = goutsum = boutsum = rsum = gsum = bsum = 0;
yp = -radius * w;
for (i = -radius; i <= radius; i++) {
yi = Math.max(0, yp) + x;
sir = stack[i + radius];
sir[0] = r[yi];
sir[1] = g[yi];
sir[2] = b[yi];
rbs = r1 - Math.abs(i);
rsum += r[yi] * rbs;
gsum += g[yi] * rbs;
bsum += b[yi] * rbs;
if (i > 0) {
rinsum += sir[0];
ginsum += sir[1];
binsum += sir[2];
} else {
routsum += sir[0];
goutsum += sir[1];
boutsum += sir[2];
}
if (i < hm) {
yp += w;
}
}
yi = x;
stackpointer = radius;
for (y = 0; y < h; y++) {
// Preserve alpha channel: ( 0xff000000 & pix[yi] )
pix[yi] = (0xff000000 & pix[yi]) | (dv[rsum] << 16) | (dv[gsum] << 8) | dv[bsum];
rsum -= routsum;
gsum -= goutsum;
bsum -= boutsum;
stackstart = stackpointer - radius + div;
sir = stack[stackstart % div];
routsum -= sir[0];
goutsum -= sir[1];
boutsum -= sir[2];
if (x == 0) {
vmin[y] = Math.min(y + r1, hm) * w;
}
p = x + vmin[y];
sir[0] = r[p];
sir[1] = g[p];
sir[2] = b[p];
rinsum += sir[0];
ginsum += sir[1];
binsum += sir[2];
rsum += rinsum;
gsum += ginsum;
bsum += binsum;
stackpointer = (stackpointer + 1) % div;
sir = stack[stackpointer];
routsum += sir[0];
goutsum += sir[1];
boutsum += sir[2];
rinsum -= sir[0];
ginsum -= sir[1];
binsum -= sir[2];
yi += w;
}
}
// Log.e("pix", w + " " + h + " " + pix.length);
bitmap.setPixels(pix, 0, w, 0, 0, w, h);
return (bitmap);
}
毛玻璃效果,直接拿去用就行了。
最近开发android app,程序中用到ToolBar控件,想设置ToolBar的NavigationIcon图标图标可是怎么设置都不管用,一直显示控件自带的。
异常:
在布局XML中设置android:navigationIcon=”@drawable/icon”或者在代码中设置都无法自定义成自己需要设置的NavigationIcon图片。
代码设置NavigationIcon如下:
Toolbar toolbar = (Toolbar)findViewById(R.id.my_toolbar);
toolbar.setNavigationIcon(R.drawable.icon);
toolbar.setTitle("Title");
toolbar.setSubtitle("Sub");
toolbar.setLogo(R.drawable.ic_launcher);
setSupportActionBar(toolbar);
解决办法:
如果你在XML布局中设置ToolBar设置NavigationIcon,那么现在需要放弃这种做法,否则始终无法显示出你设置的NavigationIcon;
必须使用代码方式:
setContentView(R.layout.activity_main);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
toolbar.setTitle("");
toolbar.setSubtitle("");
setSupportActionBar(toolbar);
DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(
this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close);
drawer.setDrawerListener(toggle);
toggle.syncState();
toolbar.setNavigationIcon(R.mipmap.userphoto);
android开发想接口获取数据是必须的操作,一般获取数据有post和get两种方式,本文讲解客户端使用post方法调取服务器端使用asp.net webapi开发接口数据。
1、访问接口类
package http;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLEncoder;
import android.widget.Toast;
public class HttpUtils {
public static String getJsonContent(String urlPath,String data) {
String webServiceUrl="http://hayi.8888.com";
try {
URL url = new URL(webServiceUrl+urlPath);
HttpURLConnection connection = (HttpURLConnection) url
.openConnection();
connection.setConnectTimeout(3000);
connection.setRequestMethod("POST");
connection.setDoOutput(true); // 发送POST请求必须设置允许输出
connection.setDoInput(true);
//获取输出流
OutputStream os = connection.getOutputStream();
os.write(data.getBytes());
os.flush();
int code = connection.getResponseCode();
if (code == 200) {
return changeInputStream(connection.getInputStream());
}
} catch (Exception e) {
System.out.println(e.getMessage());
}
return "";
}
private static String changeInputStream(InputStream inputStream) {
// TODO Auto-generated method stub
String JsonString = "";
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
int len = 0;
byte[] data = new byte[1024];
try {
while ((len = inputStream.read(data)) != -1) {
outputStream.write(data, 0, len);
}
JsonString = new String(outputStream.toByteArray());
} catch (IOException e) {
e.printStackTrace();
}
return JsonString;
}
}
2、使用方法
// 传递的数据
String dataPare = "userName=" + URLEncoder.encode(usernameTxt.getText().toString().trim(), "UTF-8")
+ "&userPass=" + URLEncoder.encode(userpassTxt.getText().toString().trim(), "UTF-8");
jsonString = HttpUtils
.getJsonContent("/api/Values/PostUserLogin",dataPare );
在andorid很多应用开发中都需要记录用户登录信息,使用静态变量手机关机用户状态清除,解决方法是使用SharedPreferences存储android用户信息。
一、SharedPreferences基础知识介绍
获取SharedPreferences的两种方式:
1 调用Context对象的getSharedPreferences()方法
2 调用Activity对象的getPreferences()方法
两种方式的区别:
调用Context对象的getSharedPreferences()方法获得的SharedPreferences对象可以被同一应用程序下的其他组件共享.
调用Activity对象的getPreferences()方法获得的SharedPreferences对象只能在该Activity中使用.
SharedPreferences的四种操作模式:
Context.MODE_PRIVATE
Context.MODE_APPEND
Context.MODE_WORLD_READABLE
Context.MODE_WORLD_WRITEABLE
Context.MODE_PRIVATE:为默认操作模式,代表该文件是私有数据,只能被应用本身访问,在该模式下,写入的内容会覆盖原文件的内容
Context.MODE_APPEND:模式会检查文件是否存在,存在就往文件追加内容,否则就创建新文件.
Context.MODE_WORLD_READABLE和Context.MODE_WORLD_WRITEABLE用来控制其他应用是否有权限读写该文件.
MODE_WORLD_READABLE:表示当前文件可以被其他应用读取.
MODE_WORLD_WRITEABLE:表示当前文件可以被其他应用写入.
二、数据保存至SharedPreferences:
用户登录成功后记录登录信息方法
SharedPreferences preferences=getSharedPreferences("user",Context.MODE_PRIVATE);
Editor editor=preferences.edit();
String userName="用户名";
editor.putString("userName", userName);
editor.commit();
三、从SharedPreferences获取数据:
SharedPreferences preferences=getSharedPreferences("user", Context.MODE_PRIVATE);
String name=preferences.getString("name",null);
四、清除SharedPreferences值
SharedPreferences preferences=getSharedPreferences("user", Context.MODE_PRIVATE);
preferences.edit().clear().commit();
用户点击用户程序退出后清除SharedPreferences登录信息
五、SharedPreferences来保存用户参数及读取
软件需求:用户输入姓名和年龄点击保存按钮将信息保存到xml中当再次登陆的时候输入的信息显示在文本框中
Activity文件
[java] view plain copy
package com.example.shareperences;
import java.util.Map;
import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
import com.example.service.PrefercesService;
public class MainActivity extends Activity {
private Button button;
private EditText name,age;
private PrefercesService prefercesService;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
button=(Button)this.findViewById(R.id.button);
name=(EditText)this.findViewById(R.id.name);
age=(EditText)this.findViewById(R.id.age);
prefercesService=new PrefercesService(this);
Map<String,String> params=prefercesService.getPreferences();
name.setText(params.get("name"));
age.setText(params.get("age"));
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
public void save(View v){
/*
* 如果想在Activity中得到SharedPreferences对象则可以用方法
* this.getPreferences(mode)这里只有一个参数 文件存储类型,此时文件的名字默认为
* 当前activity的名字 不包括包名
*/
String nameString=name.getText().toString();
String ageString=age.getText().toString();
prefercesService.save(nameString,Integer.parseInt(ageString));
Toast.makeText(MainActivity.this, R.string.success, Toast.LENGTH_LONG).show();
}
}
[java] view plain copy
package com.example.service;
import java.util.HashMap;
import java.util.Map;
import android.content.Context;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
public class PrefercesService {
private Context context;
public PrefercesService(Context context) {
super();
this.context = context;
}
/**
* 保存参数
* @param name 姓名
* @param age 年龄
*/
public void save(String name, int age) {
//第一个参数 指定名称 不需要写后缀名 第二个参数文件的操作模式
SharedPreferences preferences=context.getSharedPreferences("itcast", Context.MODE_PRIVATE);
//取到编辑器
Editor editor=preferences.edit();
editor.putString("name", name);
editor.putInt("age", age);
//把数据提交给文件中
editor.commit();
}
/**
* 获取各项配置参数
* @return
*/
public Map<String,String> getPreferences(){
SharedPreferences pre=context.getSharedPreferences("itcast", Context.MODE_PRIVATE);
//如果得到的name没有值则设置为空 pre.getString("name", "");
Map<String,String> params=new HashMap<String,String>();
params.put("name", pre.getString("name", ""));
params.put("age", String.valueOf(pre.getInt("age", 0)));
return params;
}
}
布局文件注意button应该这样设置
[html] view plain copy
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/button"
android:text="@string/save"
android:onClick="save"
/>