微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

android 笔记

 常用系统权限

//互联网权限
<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 举报,一经查实,本站将立刻删除。

相关推荐