常用系统权限
//互联网权限
<uses-permission android:name="android.permission.INTERNET"/>
//拍摄
<uses-permission android:name="android.permission.CAMERA" />
//硬件
<uses-feature android:name="android.hardware.camera" />
//写存储设备 写SD卡的权限
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
//捕获视频
<uses-permission android:name="android.permission.RECORD_AUdio" />
//得到图片信息
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
//短信发送权限
<uses-permission android:name="android.permission.SEND_SMS"/>
//杀死进程
<uses-permission android:name="android.permission.KILL_BACKGROUND_PROCESSES"/>
//手机信息
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
查看keystore 数据
打开CMD命令行进入本机安装的jdk或jre下的bin目录
keytool -list -v -keystore C:\Users\Desktop\browser\debug.keystore -storepass android
keytool -list -v -keystore C:\Users\admin\.android\debug.keystore -storepass android
MD5: F8:FA:D2:BB:04:72:6E:E6:5C:48:28:F1:14:F9:09:AF
SHA1: 88:C3:75:6F:6F:6C:51:09:00:B6:45:CB:BD:FC:84:B8:E7:F3:F1:10
SHA256: 5B:0C:B2:43:8C:49:4B:6C:5B:BB:F5:77:ED:76:EE:E0:9D:7D:6A:7D:16:A1:DF:AD:6F:FC:56:5F:F0:FC:8E:79
签名算法名称: SHA256withRSA
版本: 3
按钮点击的4中写法
1.创建一个内部类定义点击事件
setonClickListener(new qwe())//点击事件
qwe 需要实现 OnClickListener
2.匿名内部类定义点击事件
setonClickListener(new qwe{})
3setonClickListener(this)//本身的类需要实现OnClickListener
4.xml组件中添加onClick属性
拨打电话
Intent intent = new intent()
intent.setAction(Intent.ACTION_CALL)//指定事件 打电话
intent.setData(Uri.parse("tel:"+电话号码))
startActivity(intent)
进程 按优先级分为不同等级
1,前台进程:用户可以看见的某个Activity界面,可以操作的界面
2,可见进程:用户仍可看见这个进程,某个Activity界面,但是用不可以操作这个界面
3,服务进程:后台运行的服务进程
4,后台进程:没有服务进程,打开一个Activity之后 按了home键最小化
5, 空进程 :没有活动的组件,存在进程中
当内存不足时会自动回收5,4,释放资源 一般不会释放 1,2,3
sqlite需要继承 sqliteOpenHelper
//初始化并未创建(上下文,数据库名称,结果集(游标的对象null:系统默认的游标),数据库的版本(最小为1))
PersonsqliteOpenHelper helper = new PersonsqliteOpenHelper(this, "mzw.db", null, 1);
//创建数据库,getReadableDatabase:为可读的,getWritableDatabase:为可写的
//得到数据库实例(可写)
sqliteDatabase db = helper.getWritableDatabase();
//得到数据库实例(可读)
sqliteDatabase db = helper.getReadableDatabase();
//PersonsqliteOpenHelper中有个onCreate方法,数据库第一次创建的时候调用 可再此方法中创建表
db.execsql("create table person (id integer primary key autoincrement,name varchar(20),number varchar(20))");
//版本变化是调用
onUpgrade
数据库 事务
//开启事务
db.beginTransaction();
try {
//数据虎操作
db.execsql(sql, new Object[]{name});
//标记数据库事务执行成功
db.setTransactionSuccessful();
} finally {
//关闭事务
db.endTransaction();
//关闭事务
db.close();
}
从0条开始 查询10条
select * from user_chat limit 0,10
杀死进程
//得到自己进程的ID
int myid = android.os.Process.myPid();
//杀死进程(只能用于自杀)
android.os.Process.killProcess(myid);
//杀死别人 不能用于自杀
ActivityManager am = (ActivityManager) getSystemService(ACTIVITY_SERVICE);
//需要权限 <uses-permission android:name="android.permission.KILL_BACKGROUND_PROCESSES"/>
am.killBackgroundProcesses("com.example.message");
return true;
Activity启动模式
清单中配置 android:launchMode=
standard : 默认情况退出一个Activity,就把这个Activity从任务栈的栈顶移除,
如果任务栈空了,应用程序就关闭了。但是注意,进程还是存在的,
singletop : 避免同一个界面会重复的开启,
如果发现任务栈的栈顶已经有了这个Activity,再去开启Activity时,就不去重新创建了,而是复用这个栈顶已经存在的Activity
singleTask : 避免开启过多的Activity,以便节省内存和cpu资源
开启一个Activity B的时候 会检查任务栈中是否存在这个Activity B,如果存在,就清空这个Activity B上面所有的Activity,然后复用这个Activity B
singleInstance : 单例模式 开启一个新的任务栈。任务栈中只有一个Activity实例
如果Activity A开启,把A 任务栈放在前面。如果把Activity B开启,把B任务栈放在前面
极端:在整个手机中只会有一个实例存在。
Intent.setFlags()函数用法:
Intent的常用Flag参数:
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
FLAG_ACTIVITY_CLEAR_TOP:
例如现在的栈情况为:A B C D 。D此时通过intent跳转到B,如果这个intent添加FLAG_ACTIVITY_CLEAR_TOP标记,则栈情况变为:A B。
如果没有添加这个标记,则栈情况将会变成:A B C D B。也就是说,如果添加了FLAG_ACTIVITY_CLEAR_TOP标记,并且目标Activity在栈中已经存在,
则将会把位于该目标activity之上的activity从栈中弹出销毁。这跟上面把B的Launch mode设置成singleTask类似。
FLAG_ACTIVITY_NEW_TASK:
例如现在栈1的情况是:A B C。C通过intent跳转到D,并且这个intent添加了FLAG_ACTIVITY_NEW_TASK标记,如果D这个Activity在Manifest.xml中的声明中添加了Task affinity,
并且和栈1的affinity不同,系统首先会查找有没有和D的Task affinity相同的task栈存在,如果有存在,将D压入那个栈,如果不存在则会新建一个D的affinity的栈将其压入。
如果D的Task affinity默认没有设置,或者和栈1的affinity相同,则会把其压入栈1,变成:A B C D,这样就和不加FLAG_ACTIVITY_NEW_TASK标记效果是一样的了。
注意如果试图从非activity的非正常途径启动一个activity,比如从一个service中启动一个activity,则intent必须要添加FLAG_ACTIVITY_NEW_TASK标记。
FLAG_ACTIVITY_NO_HISTORY:
例如现在栈情况为:A B C。C通过intent跳转到D,这个intent添加FLAG_ACTIVITY_NO_HISTORY标志,则此时界面显示D的内容,但是它并不会压入栈中。如果按返回键,
返回到C,栈的情况还是:A B C。如果此时D中又跳转到E,栈的情况变为:A B C E,此时按返回键会回到C,因为D根本就没有被压入栈中。
FLAG_ACTIVITY_SINGLE_TOP:和上面Activity的Launch mode的singletop类似。如果某个intent添加了这个标志,并且这个intent的目标activity就是栈顶的activity,那么将不会新建一个实例压入栈中。
Activity的主要属性:(在 AndroidManifest.xml中 <activity android:XXX />)
allowTaskreparenting:设置成true时,和Intent的FLAG_ACTIVITY_NEW_TASK标记类似。
alwaysRetainTaskStat: 如果用户长时间将某个task移入后台,则系统会将该task的栈内容弹出只剩下栈底的activity,此时用户再返回,则只能看到根activity了。如果栈底的activity的这个属性设置成true,则将阻止这一行为,从而保留所有的栈内容。
clearTaskOnLaunch:根activity的这个属性设置成true时,和上面的alwaysRetainTaskStat的属性为true情况搞好相反。
finishOnTaskLaunch:对于任何activity,如果它的这个属性设置成true,则当task被放置到后台,然后重新启动后,该activity将不存在了。
清单中配置屏幕 横屏 竖屏
activity 标签中配置
android:screenorientation=""
landscape : 水平
portrait : 竖屏
屏幕切换时,销毁原有的Activity 重新创建
android:configChanges=""
orientation|keyboardHidden|screenSize 不会销毁Activity
自定义广播
自定义广播接收者
类要继承broadcastReceiver
设置自定义广播过滤器
<receiver android:name="com.example.ipdail.SmsReceiver">
<intent-filter android:priority="1000">广播优先级
<action android:name="mzw.it.xxx"></action>自定义的
</intent-filter>
</receiver>
有了广播接收者 就需要有发送者
自定义广播发送者
//把自定义的广播发送出去
Intent inten = new Intent();
inten.setAction("mzw.it.xxx");
sendbroadCast(inten);//发送一条无序的广播事件
sendOrderedbroadCast(inten,null);//发送一条有序的广播事件
//指定广播接受制。new Class 代表一个类,当指定这个接收者后,将忽略优先级、终止广播等
sendOrderedbroadCast(inten,null,new Class,null,0,null,null);
如果广播是无序的,那么所有广播接收者将都会接受到这个事件
如果广播是有序的,那么广播接受者会按照优先级接收这个事件
高优先级 会先接受到这个事件,低优先级 会后接受到事件
有序广播特点:
高优先级的广播接受者可以终止掉广播
abortbroadcast();
系统时间
system.currenTimeMillis();
if ((System.currentTimeMillis() - inputTime) > 2000) {
// 时间间隔大于2000毫秒,。。。
}
图片操作
exif获取图片信息
ExifInterface exif = new ExifInterface("/sdcard/test.jpg");
//时间
String time = exif.getAttribute(ExifInterface.TAG_DATETIME);
//什么模式的相机(设备型号)
String model = exif.getAttribute(ExifInterface.TAG_MODEL);
//纬度
String latttude = exif.getAttribute(ExifInterface.TAG_GPS_LATITUDE);
//经度
String longitude = exif.getAttribute(ExifInterface.TAG_GPS_LONGITUDE);
// 图片长
String length = exif.getAttribute(ExifInterface.TAG_IMAGE_LENGTH);
//图片宽
String width = exif.getAttribute(ExifInterface.TAG_IMAGE_WIDTH);
//设备制造商
String make = exif.getAttribute(ExifInterface.TAG_MAKE);
String msg = "\n设备型号:"+model+""
+ "\n设备制造商:"+make+""
+ "\n纬度:"+latttude+""
+ "\n经度:"+longitude+""
+ "\n图片长:"+length+""
+ "\n图片宽:"+width+"";
保存图片
File file = new File(Environment.getExternalStorageDirectory(),System.currentTimeMillis()+".jpg");
System.out.println("保存路径:"+file);
//输出流
FileOutputStream os = new FileOutputStream(file);
//保存文件(保存格式,质量,流)
newbitmap.compress(CompressFormat.JPEG, 100, os);
//模拟一个消息通知,SD被重新挂载了
Intent intent = new Intent();
intent.setAction(Intent.ACTION_MEDIA_MOUNTED);
图片水印
//copy图片并在上边写字
Bitmap bitmap = BitmapFactory.decodeResource(getResources(),R.drawable.b9, opts);
//1,创建一个空白图片,和原图片一样大
Bitmap newbitmap = Bitmap.createBitmap(bitmap.getWidth(), bitmap.getHeight(), Bitmap.Config.ARGB_8888);
//2,得到一个画布
Canvas canvas = new Canvas(newbitmap);
//3,在画布上
canvas.drawBitmap(bitmap, new Matrix(), new Paint());
//Paint paint = new Paint();
//canvas.drawText("我是拷贝图片", 10, 10, paint);
return newbitmap;
图片缩放
Matrix matrix = new Matrix();
matrix.setScale(x,y);
canvas.drawBitmap(bitmap, new Matrix(), new Paint());
图片旋转
Matrix matrix = new Matrix();
参数 :旋转度数(0 - 360),X,Y
//bitmap.getWidth()/2,bitmap.getHeight()/2 --- 以图片中心为 轴
matrix。setScale(180,bitmap.getWidth()/2,bitmap.getHeight()/2);
//因为在旋转的时候会丢失像素
所以 提供了一个方法
Paint paint = new Paint();
//消除锯齿(内部为算法)
paint.setAntiAlias(true);
canvas.drawBitmap(bitmap, new Matrix(), new Paint());
图片平移
Matrix matrix = new Matrix();
//此方法canvas.drawBitmap执行完后变化
matrix.setTranslate(X,Y)
//此方法会立即执行
matrix.postTranslate(X,Y)
canvas.drawBitmap(bitmap, new Matrix(), new Paint());
图片镜面效果
Matrix matrix = new Matrix();
matrix.setScale(x,y);//缩放
matrix.postTranslate(X,Y)//平移
//缩放时X为 -1
//将图片平移(否则就看不见图了)
图片倒影效果
Matrix matrix = new Matrix();
matrix。setScale(x,y);//缩放
matrix.postTranslate(X,Y)//平移
//缩放时Y为 -1
//将图片平移(否则就看不见图了)
图片合成
//原理就创建一个画布 将两个图片加载到这个画布中
canvas.drawBitmap(bitmap1, new Matrix(), new Paint());
canvas.drawBitmap(bitmap2, new Matrix(), new Paint());
/*
但是有 16 种模式
空白。显示1.显示2.显示1和2并且1在2上,显示1和2并且2在1上,显示1与2重叠的1部分,显示1与2重叠的2部分 等等
*/
Paint。setXfermode(new ProterDuffXfermode(android.graphics.PorterDuff.Mode.XXXX))
多媒体
mediaplayer 音频
--- 用来播放比较长得音频,如果用他播放短而密集的音频就会出现延迟
// 响铃 调用raw文件中的音乐文件
MediaPlayer.create(this, R.raw.information).start(); // 响铃
SoundPool 音频
--- 可以播放短而密集的音频
private SoundPool soundPool;
private int soundId;
private SeekBar seekBar1;
private float ff;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.fragment_main);
seekBar1 = (SeekBar)super.findViewById(R.id.seekBar1);
//声音池的初始化(最多可放资源,)
soundPool = new SoundPool(5, AudioManager.STREAM_MUSIC, 0);
//加载声音(上下文,资源,播放优先级),并且返回资源的ID
soundId = soundPool.load(this, R.raw.girl_sound, 1);
seekBar1.setMax(200);
seekBar1.setonSeekBarchangelistener(new OnSeekBarchangelistener() {
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
System.out.println("=getProgress="+seekBar.getProgress());
System.out.println("=getProgress="+seekBar.getProgress()/100.0f);
ff = seekBar.getProgress()/100.0f;
System.out.println("ff="+ff);
if(ff < 0.5f){
ff = 0.5f;
}
Toast.makeText(getApplicationContext(), "当前播放速度为:"+ff, 0).show();
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
}
@Override
public void onProgressChanged(SeekBar seekBar, int progress,
boolean fromUser) {
}
});
}
public void click(View view){
/**
* 播放声音(声音ID,左边音量大小,
* 右边音量大小(range = 0.0 to 1.0),
* 优先级0最低(range = 0.0 to 1.0),
* 循环模式(0 =没有循环,-1 =循环永远),
* 率播放率(1.0 =正常播放,范围0.5 - 2.0)----就是播放速度
* )
*/
soundPool.play(soundId, 1.0f, 1.0f, 0, 0, ff);
}
SurfaceView 视频播放
原理:
分析:视频文件的格式
读取:文件的数据(把每一帧都转化成图片 显示到界面上)
SurfaceView 采用了双缓冲计算 的技术
原来的:解析帧 --> 显示画面 --> 解析帧 --> 显示画面 --> 。。。
双缓冲:A线程:解析帧 --> 显示画面 --> 解析帧 --> 显示画面 --> 。。。
B线程: 解析帧 --> 显示画面 --> 解析帧 --> 显示画面 --> 。。。
实际上是两个线程不断的在切换后台解析与前台显示的动作
//设置监听,当返回桌面时暂停播放并记录播放进度,播放器重新启动时并指定进度播放
sv.getHolder().addCallback(new Callback() {
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
// Todo Auto-generated method stub
System.out.println("holder销毁了...");
if(mediaPlayer != null && mediaPlayer.isPlaying()){
currentPosition = mediaPlayer.getCurrentPosition();//得到当前不放的进度
stop();
}
}
@Override
public void surfaceCreated(SurfaceHolder holder) {
// Todo Auto-generated method stub
System.out.println("holder创建了...");
if(currentPosition > 0){
start(currentPosition);
}
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width,
int height) {
// Todo Auto-generated method stub
System.out.println("holder分辨率改变了...");
}
});
mediaPlayer = new MediaPlayer();
//指定播放文件的类型
mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
//指定视频在SurfaceView组建中播放
mediaPlayer.setdisplay(sv.getHolder());
//加载文件
mediaPlayer.setDataSource(url);
//异步调用(准备)
mediaPlayer.prepareAsync();
//监听,是否加载完毕
mediaPlayer.setonPreparedListener(new OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mp) {
mediaPlayer.start();
mediaPlayer.seekTo(currentPosition);
start.setEnabled(false);
}
});
//开始
mediaPlayer.start();
//暂停
mediaPlayer.pause();
//
//指定本地开始播放的位置
mediaPlayer.seekTo(0);
//暂停
mediaPlayer.stop();
//释放资源
mediaPlayer.release();
mediaPlayer = null;
//得到当前不放的进度
mediaPlayer.getCurrentPosition()
//得到视频的总程度
mediaPlayer.getDuration();
通知对话框
public void click1(View view){
//对话框的构造器
AlertDialog.Builder builder = new Builder(this);
//标题
builder.setTitle("对话框标题");
//图标(logo)
builder.setIcon(R.drawable.ic_launcher);
//对话框消息
builder.setMessage("是否继续?");
//确定按钮
builder.setPositiveButton("确定", new OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Toast.makeText(MainActivity.this, "点击的是:确定", 0).show();
}
});
//取消按钮
builder.setNegativeButton("取消",new OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
// 取消后什么也不操作
}
});
//创建对话框
builder.create().show();
}
单选对话框
public void click2(View view){
//对话框的构造器
AlertDialog.Builder builder = new Builder(this);
//标题
builder.setTitle("选择性别");
final String[] items = new String[]{"男性","女性"};
//设定单选扭
builder.setSingleChoiceItems(items, 0, new OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
// Todo Auto-generated method stub
Toast.makeText(MainActivity.this, "选择的性别是:"+items[which],0).show();
//选中 后关闭对话框
dialog.dismiss();
}
});
//取消按钮
builder.setNegativeButton("取消",new OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
// 取消后什么也不操作
}
});
builder.show();
}
多选对话框
public void click3(View view){
//对话框的构造器
AlertDialog.Builder builder = new Builder(this);
//标题
builder.setTitle("选择 爱好");
final String[] items = new String[]{"红色","橙色","黄色","绿色","蓝色"};
//设定单选扭boolean 为默认被选择
builder.setMultiChoiceItems(items, new boolean[]{true,false,false,false,false},
new OnMultiChoiceClickListener() {
@Override
public void onClick(DialogInterface dialog, int which, boolean isChecked) {
// Todo Auto-generated method stub
Toast.makeText(MainActivity.this, items[which]+":"+isChecked, 0).show();
}
});
//取消按钮
builder.setNegativeButton("取消",new OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
// 取消后什么也不操作
}
});
builder.show();
}
进度条对话框
public void click5(View view){
final ProgressDialog pd = new ProgressDialog(this);
//进度样式(水平)
pd.setProgressstyle(ProgressDialog.STYLE_HORIZONTAL);
pd.setTitle("进度提醒");
pd.setMessage("正在加载中...");
//对大进度
pd.setMax(100);
pd.show();
//模拟进度条的加载数据
new Thread(){
public void run() {
for(int i = 0;i < 100;i++){
pd.setProgress(i);
try {
Thread.sleep(40);
} catch (InterruptedException e) {
e.printstacktrace();
}
}
pd.dismiss();//关闭对话框
};
}.start();
}
tween 动画
透明度变化
public void click1(View view) {
// 开始的透明度(0.0f - 1.0f),结束透明度(0.0f - 1.0f)
AlphaAnimation animation = new AlphaAnimation(1.0f, 0.0f);
// 完成时间(从透明度到不透明用时)
animation.setDuration(3000);
// 执行次数
animation.setRepeatCount(1);
// 执行模式,REVERSE 反着执行
animation.setRepeatMode(Animation.REVERSE);
// 执行动画
// iv.setAnimation(animation);
iv.startAnimation(animation);
}
缩放变化
public void click2(View view) {
// 水平方向的缩放开始,结束 X
// 垂直方向的缩放开始,结束 Y
// X 坐标的类型(相对于自身RELATIVE_TO_SELF),位置0.5 为中心
// Y 坐标的类型(相对于自身RELATIVE_TO_SELF),位置0.5 为中心
ScaleAnimation animation = new ScaleAnimation(0.2f, 2.0f, 0.2f, 2.0f,
Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF,
0.5f);
// 完成时间(从透明度到不透明用时)
animation.setDuration(3000);
// 执行次数
animation.setRepeatCount(1);
// 执行模式,REVERSE 反着执行
animation.setRepeatMode(Animation.REVERSE);
// 执行动画
iv.startAnimation(animation);
}
旋转变化
public void click3(View view) {
// 旋转角度开始,结束
// X 坐标的类型(相对于自身RELATIVE_TO_SELF),位置0.5 为中心
// Y 坐标的类型(相对于自身RELATIVE_TO_SELF),位置0.5 为中心
RotateAnimation animation = new RotateAnimation(0, 360,
Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF,
0.5f);// 相当于以中心旋转360度
// 完成时间(从透明度到不透明用时)
animation.setDuration(3000);
// 执行次数
animation.setRepeatCount(1);
// 执行模式,REVERSE 反着执行
animation.setRepeatMode(Animation.REVERSE);
// 执行动画
iv.startAnimation(animation);
}
平移变化
public void click4(View view) {
// X 坐标的类型(相对于父窗体RELATIVE_TO_PARENT), 开始X坐标
// X 坐标的类型(相对于父窗体RELATIVE_TO_PARENT), 结束X坐标
// Y 坐标的类型(相对于父窗体RELATIVE_TO_PARENT), 开始Y坐标
// Y 坐标的类型(相对于父窗体RELATIVE_TO_PARENT), 结束Y坐标
TranslateAnimation animation = new TranslateAnimation(
Animation.RELATIVE_TO_SELF, 0.0f, Animation.RELATIVE_TO_PARENT,
1.2f, Animation.RELATIVE_TO_SELF, 0.0f,
Animation.RELATIVE_TO_PARENT, 1.2f);
// 完成时间(从透明度到不透明用时)
animation.setDuration(3000);
// 执行次数
animation.setRepeatCount(1);
// 执行模式,REVERSE 反着执行
animation.setRepeatMode(Animation.REVERSE);
// 执行动画
iv.startAnimation(animation);
}
组合变化
public void click5(View view) {
// 动画播放的速率
AnimationSet animation = new AnimationSet(false);
// 定义动画 -- 平移
TranslateAnimation ta = new TranslateAnimation(
Animation.RELATIVE_TO_SELF, 0.0f, Animation.RELATIVE_TO_PARENT,
1.2f, Animation.RELATIVE_TO_SELF, 0.0f,
Animation.RELATIVE_TO_PARENT, 1.2f);
ta.setDuration(3000);
ta.setRepeatCount(1);
// 定义动画 -- 旋转
RotateAnimation ra = new RotateAnimation(0, 360,
Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF,
0.5f);// 相当于以中心旋转360度
ra.setDuration(3000);
ra.setRepeatCount(1);
// 定义动画 -- 缩放
ScaleAnimation sa = new ScaleAnimation(0.2f, 2.0f, 0.2f, 2.0f,
Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF,
0.5f);
sa.setDuration(3000);
sa.setRepeatCount(1);
// 执行模式,REVERSE 反着执行
animation.setRepeatMode(Animation.REVERSE);
// 将动画添加到集合
animation.addAnimation(ta);
animation.addAnimation(ra);
animation.addAnimation(sa);
// 执行动画
iv.startAnimation(animation);
}
是让屏幕保持不暗不关闭的最好方法
getwindow().setFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON, WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
Android全屏设置及取消全屏设置
getwindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
Android中全屏取消标题栏
requestwindowFeature(Window.FEATURE_NO_TITLE);
SD卡 路径
Environment.getExternalStorageDirectory()
单行文本跑马灯控件
// 重新写一个 textview 继承 textview 重写 isFocused 方法
public class ScrollForeverTextView extends TextView {
public ScrollForeverTextView(Context context) {
super(context);
// Todo Auto-generated constructor stub
}
public ScrollForeverTextView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public ScrollForeverTextView(Context context, AttributeSet attrs,
int defStyle) {
super(context, attrs, defStyle);
}
@Override
public boolean isFocused() {
return true;
}
}
android:ellipsize="marquee"//滚动
android:focusable="true"
android:marqueeRepeatLimit="marquee_forever"//循环滚动
android:singleLine="true"//一行显示
textView
mine_forget_password.getPaint().setFlags(Paint.UNDERLINE_TEXT_FLAG);//下划线
textView.getPaint().setFlags(Paint. UNDERLINE_TEXT_FLAG ); //下划线
textView.getPaint().setAntiAlias(true);//抗锯齿
textview.getPaint().setFlags(Paint. STRIKE_THRU_TEXT_FLAG); //中划线
setFlags(Paint. STRIKE_THRU_TEXT_FLAG|Paint.ANTI_ALIAS_FLAG); // 设置中划线并加清晰
textView.getPaint().setFlags(0); // 取消设置的的划线
TextView使用HTML
// Android TextView使用HTML处理字体样式、显示图片等 textview html 图片 样式
final String html="<html>"
+ "<head>"
+ "<title>TextView使用HTML</title>"
+ "</head>"
+ "<body>"
+ "<p><strong>强调</strong></p>"
+ "<p><em>斜体</em></p>"
+ "<p><a href=\"http://www.dreamdu.com/xhtml/\">超链接HTML入门</a>学习HTML!</p>"
+ "<p><font color=\"#aabb00\">颜色1</p>"
+ "<p><font color=\"#00bbaa\">颜色2</p>"
+ "<h1>标题1</h1>"
+ "<h3>标题2</h3>"
+ "<h6>标题3</h6>"
+ "<p>大于>小于</p>"
+ "<p>下面是网络图片</p>"
+ "<img src=\"http://f.hiphotos.bdimg.com/album/w%3D2048/sign=8b216c08ac6eddc426e7b3fb0de3b4fd/0b55b319ebc4b745c67cf5fbcefc1e178b821576.jpg\"/>"
+ "<img src=\"https://avatar.csdn.net/0/3/8/2_zhang957411207.jpg\"/>"
+ "</body>"
+ "</html>";
new Thread(new Runnable() {
public void run() {
spanned = Html.fromHtml(html, imgGetter, null);
handler.sendEmptyMessage(5);
}
}).start();
ImageGetter imgGetter = new Html.ImageGetter() {
public Drawable getDrawable(String source) {
Drawable drawable = null;
URL url;
try {
url = new URL(source);
drawable = Drawable.createFromStream(url.openStream(), ""); //获取网路图片
} catch (Exception e) {
e.printstacktrace();
return null;
}
drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight());
return drawable;
}
};
bargain_item_004.setText(spanned);
隐藏键盘
//隐藏键盘
((InputMethodManager)getSystemService(INPUT_METHOD_SERVICE)).hideSoftInputFromWindow(commoditySearchActivity.this.getCurrentFocus().getwindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
android 获取 手机信息
//核心代码:
Imei = ((TelephonyManager) getSystemService(TELEPHONY_SERVICE)).getdeviceid();
//在manifest.xml文件中要添加
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
示例代码
package net.sunniwell.app;
import android.app.Activity;
import android.os.Bundle;
import android.telephony.CellLocation;
import android.telephony.PhonestateListener;
import android.telephony.TelephonyManager;
public class TelManager extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
TelephonyManager tm = (TelephonyManager) this.getSystemService(TELEPHONY_SERVICE);
/*
* 电话状态:
* 1.tm.CALL_STATE_IDLE=0 无活动
* 2.tm.CALL_STATE_RINGING=1 响铃
* 3.tm.CALL_STATE_OFFHOOK=2 摘机
*/
tm.getCallState();//int
/*
* 电话方位:
*
*/
tm.getCellLocation();//CellLocation
/*
* 唯一的设备ID:
* GSM手机的 IMEI 和 CDMA手机的 MEID.
* Return null if device ID is not available.
*/
tm.getdeviceid();//String
/*
* 设备的软件版本号:
* 例如:the IMEI/SV(software version) for GSM phones.
* Return null if the software version is not available.
*/
tm.getDeviceSoftwareversion();//String
/*
* 手机号:
* GSM手机的 MSISDN.
* Return null if it is unavailable.
*/
tm.getLine1Number();//String
/*
* 附近的电话的信息:
* 类型:List<NeighboringCellInfo>
* 需要权限:android.Manifest.permission#ACCESS_COARSE_UPDATES
*/
tm.getNeighboringCellInfo();//List<NeighboringCellInfo>
/*
* 获取ISO标准的国家码,即国际长途区号。
* 注意:仅当用户已在网络注册后有效。
* 在CDMA网络中结果也许不可靠。
*/
tm.getNetworkCountryIso();//String
/*
* MCC+MNC(mobile country code + mobile network code)
* 注意:仅当用户已在网络注册时有效。
* 在CDMA网络中结果也许不可靠。
*/
tm.getNetworkOperator();//String
/*
* 按照字母次序的current registered operator(当前已注册的用户)的名字
* 注意:仅当用户已在网络注册时有效。
* 在CDMA网络中结果也许不可靠。
*/
tm.getNetworkOperatorName();//String
/*
* 当前使用的网络类型:
* 例如: NETWORK_TYPE_UNKNowN 网络类型未知 0
NETWORK_TYPE_GPRS GPRS网络 1
NETWORK_TYPE_EDGE EDGE网络 2
NETWORK_TYPE_umts umts网络 3
NETWORK_TYPE_HSDPA HSDPA网络 8
NETWORK_TYPE_HSUPA HSUPA网络 9
NETWORK_TYPE_HSPA HSPA网络 10
NETWORK_TYPE_CDMA CDMA网络,IS95A 或 IS95B. 4
NETWORK_TYPE_EVDO_0 EVDO网络, revision 0. 5
NETWORK_TYPE_EVDO_A EVDO网络, revision A. 6
NETWORK_TYPE_1xRTT 1xRTT网络 7
*/
tm.getNetworkType();//int
/*
* 手机类型:
* 例如: PHONE_TYPE_NONE 无信号
PHONE_TYPE_GSM GSM信号
PHONE_TYPE_CDMA CDMA信号
*/
tm.getPhoneType();//int
/*
* Returns the ISO country code equivalent for the SIM provider's country code.
* 获取ISO国家码,相当于提供SIM卡的国家码。
*
*/
tm.getSimCountryIso();//String
/*
* Returns the MCC+MNC (mobile country code + mobile network code) of the provider of the SIM. 5 or 6 decimal digits.
* 获取SIM卡提供的移动国家码和移动网络码.5或6位的十进制数字.
* SIM卡的状态必须是 SIM_STATE_READY(使用getSimstate()判断).
*/
tm.getSimOperator();//String
/*
* 服务商名称:
* 例如:中国移动、联通
* SIM卡的状态必须是 SIM_STATE_READY(使用getSimstate()判断).
*/
tm.getSimOperatorName();//String
/*
* SIM卡的序列号:
* 需要权限:READ_PHONE_STATE
*/
tm.getSimserialNumber();//String
/*
* SIM的状态信息:
* SIM_STATE_UNKNowN 未知状态 0
SIM_STATE_ABSENT 没插卡 1
SIM_STATE_PIN_required 锁定状态,需要用户的PIN码解锁 2
SIM_STATE_PUK_required 锁定状态,需要用户的PUK码解锁 3
SIM_STATE_NETWORK_LOCKED 锁定状态,需要网络的PIN码解锁 4
SIM_STATE_READY 就绪状态 5
*/
tm.getSimstate();//int
/*
* 唯一的用户ID:
* 例如:imsI(国际移动用户识别码) for a GSM phone.
* 需要权限:READ_PHONE_STATE
*/
tm.getSubscriberId();//String
/*
* 取得和语音邮件相关的标签,即为识别符
* 需要权限:READ_PHONE_STATE
*/
tm.getVoiceMailAlphaTag();//String
/*
* 获取语音邮件号码:
* 需要权限:READ_PHONE_STATE
*/
tm.getVoiceMailNumber();//String
/*
* ICC卡是否存在
*/
tm.hasIccCard();//boolean
/*
* 是否漫游:
* (在GSM用途下)
*/
tm.isNetworkRoaming();//
}
}
SpannableString使用
/**
* 超链接
*/
private void addUrlSpan() {
SpannableString spanString = new SpannableString("超链接");
URLSpan span = new URLSpan("tel:0123456789");
spanString.setSpan(span, 0, 3, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
tv.append(spanString);
}
/**
* 文字背景颜色
*/
private void addBackColorSpan() {
SpannableString spanString = new SpannableString("颜色2");
BackgroundColorSpan span = new BackgroundColorSpan(Color.YELLOW);
spanString.setSpan(span, 0, 3, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
tv.append(spanString);
}
/**
* 文字颜色
*/
private void addForeColorSpan() {
SpannableString spanString = new SpannableString("颜色1");
ForegroundColorSpan span = new ForegroundColorSpan(Color.BLUE);
spanString.setSpan(span, 0, 3, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
tv.append(spanString);
}
/**
* 字体大小
*/
private void addFontSpan() {
SpannableString spanString = new SpannableString("36号字体");
AbsoluteSizeSpan span = new AbsoluteSizeSpan(36);
spanString.setSpan(span, 0, 5, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
tv.append(spanString);
}
/**
* 粗体,斜体
*/
private void addStyleSpan() {
SpannableString spanString = new SpannableString("BIBI");
StyleSpan span = new StyleSpan(Typeface.BOLD_ITALIC);
spanString.setSpan(span, 0, 2, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
tv.append(spanString);
}
/**
* 删除线
*/
private void addStrikeSpan() {
SpannableString spanString = new SpannableString("删除线");
StrikethroughSpan span = new StrikethroughSpan();
spanString.setSpan(span, 0, 3, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
tv.append(spanString);
}
/**
* 下划线
*/
private void addUnderLinespan() {
SpannableString spanString = new SpannableString("下划线");
Underlinespan span = new Underlinespan();
spanString.setSpan(span, 0, 3, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
tv.append(spanString);
}
/**
* 图片
*/
private void addImageSpan() {
SpannableString spanString = new SpannableString(" ");
Drawable d = getResources().getDrawable(R.drawable.ic_launcher);
d.setBounds(0, 0, d.getIntrinsicWidth(), d.getIntrinsicHeight());
ImageSpan span = new ImageSpan(d, ImageSpan.ALIGN_BASELINE);
spanString.setSpan(span, 0, 1, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
tv.append(spanString);
}
textview中某些字段设置点击监听
import android.app.Activity;
import android.os.Bundle;
import android.text.SpannableString;
import android.text.Spanned;
import android.text.method.LinkMovementMethod;
import android.text.style.ClickableSpan;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;
public class ClickableText extends Activity {
/** Called when the activity is first created. */
private TextView mClickableText;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
LinearLayout layout = new LinearLayout(this);
mClickableText = new TextView(this);
mClickableText.setClickable(true);
mClickableText.setTextSize(20);
layout.addView(mClickableText);
setContentView(layout);
mClickableText.setText(getClickableSpan());
mClickableText.setMovementMethod(LinkMovementMethod.getInstance());
}
private SpannableString getClickableSpan()
{
View.OnClickListener l = new View.OnClickListener(){
@Override
public void onClick(View v)
{
Toast.makeText(ClickableText.this, "Click Success", Toast.LENGTH_SHORT).show();
}
};
SpannableString spanableInfo = new SpannableString("This is a test, Click Me");
int start = 16;
int end = spanableInfo.length();
spanableInfo.setSpan(new Clickable(l), start, end, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
return spanableInfo;
}
}
class Clickable extends ClickableSpan implements OnClickListener{
private final View.OnClickListener mListener;
public Clickable(View.OnClickListener l){
mListener = l;
}
@Override
public void onClick(View v){
mListener.onClick(v);
}
}
获取资源 以StringName获取资源
int sourceID = 0;
try {
Field field = Class.forName("com.eworld.R$drawable").getField(imageName);
sourceID = field.getInt(field);
} catch (Exception e) {
// ...
}
判断数字,判断字母,判断汉字
String txt = item.getTitle();
Pattern p = Pattern.compile("[0-9]*");
Matcher m = p.matcher(txt);
if (m.matches()) {
LogUtils.i("-----",txt+"->是数字");
}else{
LogUtils.i("-----",txt+"->不是数字");
}
// p = Pattern.compile("[a-zA-Z]");
// m = p.matcher(txt);
// if (m.matches()) {
// Toast.makeText(SystemMessageActivity.this, "输入的是字母", Toast.LENGTH_SHORT).show();
// }
// p = Pattern.compile("[\u4e00-\u9fa5]");
// m = p.matcher(txt);
// if (m.matches()) {
// Toast.makeText(SystemMessageActivity.this, "输入的是汉字", Toast.LENGTH_SHORT).show();
// }
抓取图片地址
/**
* 得到网页中图片的地址 http://image.baidu.com/
*/
public static List<String> getImgSrcList(String htmlStr) {
List<String> pics = new ArrayList<String>();
String regEx_img = "<img.*?src=\"http://(.*?).jpg\""; // 图片链接地址
Pattern p_image = Pattern.compile(regEx_img, Pattern.CASE_INSENSITIVE);
Matcher m_image = p_image.matcher(htmlStr);
while (m_image.find()) {
String src = m_image.group(1);
if (src.length() < 100) {
pics.add("http://" + src + ".jpg");
}
}
return pics;
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。