1.Notification:
//創(chuàng)建并發(fā)送通知
NotificationManager manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE); //獲取一個通知管理器
//創(chuàng)建通知對象
Notification.Builder builder ;
int channelId = 1;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O){ //Android 8.0適配
NotificationChannel channel = new NotificationChannel(String.valueOf(channelId),
"channel_name",
NotificationManager.IMPORTANCE_HIGH);
channel.enableLights(true);
channel.enableVibration(true);
channel.setLockscreenVisibility(Notification.VISIBILITY_PRIVATE);//設(shè)置是否應(yīng)在鎖定屏幕上顯示此頻道的通知
channel.setVibrationPattern(new long[]{100,200,300,400,500,600});//設(shè)置震動頻率
channel.setLightColor(Color.WHITE); //設(shè)置指示燈顏色
manager.createNotificationChannel(channel);
builder = new Notification.Builder(this,String.valueOf(channelId));
}else{
builder = new Notification.Builder(this);
}
Intent intent = new Intent(this,UIActivity.class);//點擊通知后要跳轉(zhuǎn)的目標(biāo)
PendingIntent pi = PendingIntent.getActivity(this,0,intent,0);
builder.setContentTitle("您有一個新通知") //指定通知欄的標(biāo)題內(nèi)容
.setContentText("點擊打開看看") //通知的正文內(nèi)容
.setAutoCancel(true) //設(shè)置通知打開后自動消失
.setWhen(System.currentTimeMillis()) //通知創(chuàng)建的時間
.setSmallIcon(R.mipmap.toast_img) //通知顯示的小圖標(biāo)值戳,只能用alpha圖層的圖片進(jìn)行設(shè)置
// .setDefaults(Notification.DEFAULT_SOUND|Notification.DEFAULT_VIBRATE)//設(shè)置聲音和振動
.setDefaults(Notification.DEFAULT_ALL)
// .setOnlyAlertOnce(true)//每次只會提醒一次聲音议谷,不會重復(fù)提醒。
.setContentIntent(pi);
Notification notification = builder.build() ;
//channelId為本條通知的id
manager.notify(channelId,notification);
2.廣播:
廣播有兩種堕虹,一種是動態(tài)廣播卧晓,一種是靜態(tài)廣播,現(xiàn)在的版本Google不推薦使用靜態(tài)注冊廣播的方法鲫凶,安全性不高禀崖,下面先將一些公共操作說明一下;
Manifest.xml配置application:
<receiver
android:name=".notification.MyBroadcastReceiver"
android:enabled="true"
android:exported="true">
<intent-filter>
<action android:name="peng" />
<action android:name="peng2" />
</intent-filter>
</receiver>
MyBroadcastReceiver.java://廣播接受者的處理
public class MyBroadcastReceiver extends BroadcastReceiver {
private static final String ACTION1 = "peng"; //動作1---靜態(tài)
private static final String ACTION2 = "peng2"; //動作2---動態(tài)
@Override
public void onReceive(Context context, Intent intent) {
if(intent.getAction().equals(ACTION1)){
ToastUtil.showMsg(context,"MyBroadcastReceiver收到:peng的廣播");
}else if (intent.getAction().equals(ACTION2)){
ToastUtil.showMsg(context,"MyBroadcastReceiver收到:peng2的廣播");
}
}
}
-
靜態(tài)廣播 :
intent = new Intent(); intent.setAction("peng");//為intent添加動作 intent.setClassName(this,"com.example.bilibili.notification.MyBroadcastReceiver"); sendBroadcast(intent);
-
動態(tài)廣播:
//動態(tài)注冊廣播 receiver = new MyBroadcastReceiver(); IntentFilter filter = new IntentFilter(); filter.addAction("peng2"); registerReceiver(receiver, filter); intent = new Intent(); intent.setAction("peng2");//為intent添加動作 sendBroadcast(intent);
最后螟炫,當(dāng)頁面銷毀時要注銷掉廣播:
@Override
protected void onDestroy() {
unregisterReceiver(receiver);
super.onDestroy();
}
3.AlarmManager:(例:鬧鐘管理通知)
布局文件為一個TimePicker
Intent intent = new Intent(TimePickerActivity.this, AlarmActivity.class);
//獲取顯示鬧鐘的pendingIntent對象
PendingIntent pendingIntent = PendingIntent.getActivity(TimePickerActivity.this,0,intent,0);
AlarmManager alarm = (AlarmManager) getSystemService(Context.ALARM_SERVICE);//
Calendar calendar = Calendar.getInstance();//獲取日歷對象
calendar.set(Calendar.HOUR_OF_DAY,timePicker.getCurrentHour());//設(shè)置鬧鐘小時數(shù)
calendar.set(Calendar.MINUTE,timePicker.getCurrentMinute());//設(shè)置鬧鐘分鐘數(shù)
calendar.set(Calendar.SECOND,0);//設(shè)置鬧鐘秒數(shù)
alarm.set(AlarmManager.RTC_WAKEUP,calendar.getTimeInMillis(),pendingIntent);//設(shè)置鬧鐘
ToastUtil.showMsg(TimePickerActivity.this,"鬧鐘設(shè)置成功");
/************
* ELAPSED_REALTIME:在指定的延時后提醒波附,不喚醒系統(tǒng)
*
* ELAPSED_REALTIME_WAKEUP:在指定的延時后提醒,喚醒系統(tǒng)
*
* RTC:到達(dá)指定時間提醒昼钻,不喚醒系統(tǒng)
*
* RTC_WAKEUP:到達(dá)指定時間提醒掸屡,喚醒系統(tǒng)
* ***********/
4.繪圖Canvas
布局:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:padding="15dp">
<Button
android:id="@+id/btn_paint_canvas"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="繪制矩形"/>
<FrameLayout
android:id="@+id/draw_rect"
android:layout_width="400dp"
android:layout_height="100dp"
android:background="#F1F1F1" />
</LinearLayout>
-
繪制矩形
btn_paint_canvas.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { frameLayout_rect.addView(new DrawRect(CanvasActivity.this));//將自定義view添加到幀布局管理器中 } });
DrawRect.java:
public class DrawRect extends View {
public DrawRect(Context context) {
super(context);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
Paint paint = new Paint();
paint.setColor(0xFFFF6600);
paint.setStyle(Paint.Style.FILL);//設(shè)置為填充方式
canvas.drawRect(15,15,280,150,paint);//繪制填充矩形
}
}
- 繪制機(jī)器人
步驟與繪制矩形一致,addView布局換成DrawRobot
DrawRobot.java:
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
Paint paint = new Paint();
paint.setAntiAlias(true);//采用抗鋸齒功能
paint.setColor(0xFFA4C739);//綠色
//繪制機(jī)器人的頭
RectF rectF = new RectF(10,10,100,100);//定義外輪廓矩形
rectF.offset(90,20);
canvas.drawArc(rectF,-10,-160,false,paint);//繪制弧
//繪制眼睛
paint.setColor(0xffffffff);
canvas.drawCircle(165,53,4,paint);//繪制圓
canvas.drawCircle(125,53,4,paint);//繪制圓
//繪制天線
paint.setColor(0xFFA4C739);
paint.setStrokeWidth(2);//設(shè)置筆觸寬度
canvas.drawLine(110,15,125,35,paint);//繪制線
canvas.drawLine(180,15,165,35,paint);//繪制線
//繪制身體
canvas.drawRect(100,75,190,150,paint);//繪制矩形
RectF rectF_body = new RectF(100,140,190,160);
canvas.drawRoundRect(rectF_body,10,10,paint);//繪制圓角矩形
//繪制胳膊
RectF rectF_arm = new RectF(75,75,95,140);
canvas.drawRoundRect(rectF_arm,10,10,paint);//繪制圓角矩形
rectF_arm.offset(120,0);
canvas.drawRoundRect(rectF_arm,10,10,paint);//繪制圓角矩形
//繪制腿
RectF rectF_leg = new RectF(115,150,135,200);
canvas.drawRoundRect(rectF_leg,10,10,paint);//繪制圓角矩形
rectF_leg.offset(40,0);
canvas.drawRoundRect(rectF_leg,10,10,paint);//繪制圓角矩形
}
- 繪制文本
步驟與繪制矩形一致然评,addView布局換成DrawText
DrawText:
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
//繪制對白
Paint paint = new Paint();
paint.setColor(0xFFFF0000);
paint.setAntiAlias(true);
paint.setTextAlign(Paint.Align.LEFT);//設(shè)置文字對齊方式
paint.setTextSize(20);
canvas.drawText("你想和我一起",175,160,paint);
canvas.drawText("去探險嗎仅财?",175,185,paint);
canvas.drawText("不,我不想去碗淌!",245,45,paint);
}
- 繪制位圖DrawBitmap
步驟與繪制矩形一致盏求,addView布局換成DrawBitmap
DrawBitmap:
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
Paint paint = new Paint();
String path = Environment.getExternalStorageDirectory()+"/1.jpg";
Log.v("PATH:",Environment.getExternalStorageDirectory()+"");
Bitmap bitmap = BitmapFactory.decodeFile(path);//創(chuàng)建位圖對象
canvas.drawBitmap(bitmap,10,10,paint);
//挖取一小塊圖片
Bitmap bitmap1 = Bitmap.createBitmap(bitmap,23,89,250,368);
canvas.drawBitmap(bitmap1,116,166,paint);
}
- 繪制路徑DrawPath
步驟與繪制矩形一致,addView布局換成DrawPath
DrawPath:
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
//繪制對白
Paint paint = new Paint();
paint.setAntiAlias(true);
paint.setColor(Color.BLUE);
paint.setStyle(Paint.Style.STROKE);//設(shè)置填充樣式為描邊
Path path = new Path();
path.addCircle(150,100,50,Path.Direction.CW);//創(chuàng)建圓形路徑---CW:逆時針亿眠,CCW:順時針
canvas.drawPath(path,paint);
Path path2 = new Path();
paint.setTextSize(34);
paint.setStyle(Paint.Style.FILL);
path2.addCircle(350,200,100,Path.Direction.CCW);//創(chuàng)建圓形路徑---CW:逆時針碎罚,CCW:順時針
//繪制繞路徑的文本
canvas.drawTextOnPath("活著就是為了改變世界",path2,0,0,paint);
}
5.幀動畫
布局:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:padding="15dp">
<Button
android:id="@+id/btn_zhen_anim"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="繪制幀動畫"/>
<FrameLayout
android:id="@+id/draw_zhen_anim"
android:layout_width="match_parent"
android:layout_height="300dp"
android:layout_marginTop="20dp"
android:background="@drawable/fairy"/>
</LinearLayout>
fairy.xml:(幀動畫圖片自己去找)
<?xml version="1.0" encoding="utf-8"?>
<animation-list xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@drawable/progress_1" android:duration="60"/>
<item android:drawable="@drawable/progress_2" android:duration="60"/>
<item android:drawable="@drawable/progress_3" android:duration="60"/>
<item android:drawable="@drawable/progress_4" android:duration="60"/>
<item android:drawable="@drawable/progress_5" android:duration="60"/>
<item android:drawable="@drawable/progress_6" android:duration="60"/>
<item android:drawable="@drawable/progress_7" android:duration="60"/>
<item android:drawable="@drawable/progress_8" android:duration="60"/>
</animation-list>
代碼:
private AnimationDrawable animationDrawable;
private FrameLayout frameLayout_zhen_anim;
private boolean flag = true;//記錄播放狀態(tài)
frameLayout_zhen_anim = findViewById(R.id.draw_zhen_anim);
animationDrawable = (AnimationDrawable) frameLayout_zhen_anim.getBackground();
btn_zhen_anim.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(flag){
animationDrawable.start();
flag = false;
}else{
animationDrawable.stop();
flag = true;
}
}
});
6.加載動畫資源文件動畫
布局:
<ImageView
android:id="@+id/img_bu_anim"
android:layout_width="match_parent"
android:layout_height="400dp"
android:src="@mipmap/bg"
android:scaleType="centerCrop"/>
R.drawable.translate:
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<translate
android:fromXDelta="0"
android:fromYDelta="0"
android:toXDelta="300"
android:toYDelta="300"
android:duration="2000"/>
</set>
R.drawable.scale:
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<scale
android:fromXScale="1"
android:fromYScale="1"
android:toXScale="2"
android:toYScale="2"
android:pivotX="50%"
android:pivotY="50%"
android:duration="2000"/>
</set>
R.drawable.alpha:
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<alpha
android:fromAlpha="0"
android:toAlpha="1"
android:duration="2000"/>
</set>
代碼:(我這里放在了drawable里面是不對的,應(yīng)該放到anim文件中纳像,但我的放里面找不到荆烈,暫時不知道原因)
img_bu_anim.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// Animation animation = AnimationUtils.loadAnimation(CanvasActivity.this,R.drawable.alpha);
// Animation animation = AnimationUtils.loadAnimation(CanvasActivity.this,R.drawable.rotate);
// Animation animation = AnimationUtils.loadAnimation(CanvasActivity.this,R.drawable.scale);
Animation animation = AnimationUtils.loadAnimation(CanvasActivity.this,R.drawable.translate);
img_bu_anim.startAnimation(animation);
}
});