旋转toast 自定义toast方向,支持多个方向的显示,自定义View
package com.example.canvasdemo;
import java.security.InvalidAlgorithmParameterException;
import android.animation.ObjectAnimator;
import android.animation.ValueAnimator;
import android.animation.ValueAnimator.AnimatorUpdateListener;
import android.annotation.SuppressLint;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Paint.FontMetrics;
import android.util.AttributeSet;
import android.util.Log;
import android.view.View;
public class RotateToast extends View{
private static final int MVISIABLE = 0x0;
private Paint mPaint = null;
private int mW = 0;
private int mH = 0;
private String mContentText = "";
private int mFlag = 1;
private Type mOrientation = Type.ORITATION;
private Duration mDuration = Duration.SHORT;
private ObjectAnimator anim;
public RotateToast(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
initData();
}
public RotateToast(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public RotateToast(Context context) {
this(context, null);
}
private void initData(){
mPaint = new Paint();
mPaint.setAntiAlias(true);
mPaint.setDither(true);
mPaint.setColor(Color.parseColor("#000000"));
mPaint.setTextSize(24);
mPaint.setStyle(Paint.Style.STROKE);
initAnim();
}
private void initAnim(){
int duration = mDuration.ordinal() == 0 ? 2000 : 3000;
anim = ObjectAnimator
.ofFloat(this, "liemng", 1.0F, 0.0F).setDuration(duration);
anim.addUpdateListener(new TimerAnimListener());
}
@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
super.onSizeChanged(w, h, oldw, oldh);
mW = w;
mH = h;
}
/**
* toast渐变效果
*/
public void startAnim(){
if(anim.isRunning()){
anim.cancel();
}
anim.start();
}
public void setText(String text) {
if(null == text){
new IllegalArgumentException("Invalid args && draw text no null");
return ;
}
this.mContentText = text;
}
public void setOrientation(Type type){
this.mOrientation = type;
}
public void setTextSize(int size){
if(size < 36){
new InvalidAlgorithmParameterException("Android not know < 12sp textSize");
}
mPaint.setTextSize(size);
}
public void setDuration(Duration mDuration){
this.mDuration = mDuration;
}
public void setVisiable(boolean isVisiable){
if(isVisiable){
mFlag |= MVISIABLE;
}else{
mFlag &= ~MVISIABLE;
}
}
@SuppressLint("NewApi")
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
if((mFlag & MVISIABLE) != MVISIABLE) return;
canvas.save();
int ori = 0;
switch (mOrientation.ordinal()) {
case 1:
ori = 90;
break;
case 2:
ori = 180;
break;
case 3:
ori = 270;
break;
default:
ori = 0;
break;
}
int mRotatePonitX = mW/2;
int mRotatePonitY = mH/2;
canvas.rotate(ori, mRotatePonitX, mRotatePonitY);
int textW = (int) mPaint.measureText(mContentText);
canvas.drawText(mContentText, mRotatePonitX - textW/2, mRotatePonitY, mPaint);
//--绘制外边框
FontMetrics fontMetrics = mPaint.getFontMetrics();
//--这里可以增加deta值,使的文字和边框有一定的padding效果
int left = mRotatePonitX - textW/2;
int top = (int) (mRotatePonitY + fontMetrics.ascent);
int right = mRotatePonitX + textW/2;
int bottom = (int) (mRotatePonitY + fontMetrics.descent);
canvas.drawRoundRect(left, top, right, bottom, mRotatePonitX - textW/2, mRotatePonitY, mPaint);
canvas.restore();
}
public enum Type{
ORITATION,ORITATION_90,ORITATION_180,ORITATION_270;
}
public enum Duration{
SHORT,LONG;
}
private class TimerAnimListener implements AnimatorUpdateListener {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
// TODO Auto-generated method stub
Log.d("TAG","mDuration = " + animation.getCurrentPlayTime());
float mTotaltime = mDuration == Duration.SHORT ? 2000f : 3000f;
float currentPlayTime = animation.getCurrentPlayTime();
float alpha = ((mTotaltime - currentPlayTime)/mTotaltime * 255);
Log.d("TAG","alpha = " + ((mTotaltime - currentPlayTime)/mTotaltime * 255));
if(alpha <= 0)
alpha = 0;
mPaint.setAlpha((int)alpha);
invalidate();
}
}
}
实际效果,这里设置方向为90,所以效果如下:可能跟大家想要的效果不太一样,当然大家可以根据自己的需要增加相应的padding值。如文字和边框的间距

旋转toast 自定义toast方向,支持多个方向的显示,自定义View的更多相关文章
- 写了一个迷你toast提示插件,支持自定义提示文字和显示时间
写了一个迷你toast提示插件,支持自定义提示文字和显示时间,不想用其他第三方的ui插件,又想要toast等小效果来完善交互的同学可以试试, 代码中还贡献了一段css能力检测js工具函数,做项目的时候 ...
- 微信小程序自定义toast的实现
今天写微信小程序突然发现一个尴尬的问题,请求报错需要提示,就去小程序API里找,可悲的小程序的toast并不能满足我的需求,原生提供的方法调用如下 wx.showToast({ title: '成功' ...
- 023 Android 自定义Toast控件
1.Toast自定义控件工具类 package com.example.administrator.test62360safeguard.Utils; import android.content.C ...
- Android带图片的Toast(自定义Toast)
使用Android默认的Toast Toast简介: Toast是一个简单的消息显示框,能够短暂的出现在屏幕的某个位置,显示提示消息. 默认的位置是屏幕的下方正中,一般Toast的使用如下: Toas ...
- 自定义Toast和RatingBar的简单用例
Toast是一个包含用户点击消息.Toast类会帮助你创建和显示这些.Android中的Toast是一种简易的消息提示框. 当视图显示给用户,在应用程序中显示为浮动 向右划动五角星增加 单击按钮显示自 ...
- 自定义Toast解决快速点击时重复弹出,排队无止尽
解决办法:自定义MyToast类: public class MyToast { /** 之前显示的内容 */ private static String oldMsg ; /** Toast对象 * ...
- 朝花夕拾-android 自定义toast
在一个只有你而且还未知的世界中,不去探索未知,死守一处,你到底在守什么呢? 作为一个目前的android程序员,可能过去写着delphi的代码,可能未来回去搭建服务器.不管怎样,你现在是一名安卓程序员 ...
- Android 自定义Toast
自定义Toast 其实就是自定义布局文件 感觉利用Dialog或者PopupWindow做也差不多 上图上代码 public class MainActivity extends Activity { ...
- android135 360 来电去电归属地显示,自定义toast,
点击会开启服务. sivAddress.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) ...
- Android Toast 设置到屏幕中间,自定义Toast的实现方法,及其说明
http://blog.csdn.net/wangfayinn/article/details/8065763 Android Toast用于在手机屏幕上向用户显示一条信息,一段时间后信息会自动消失. ...
随机推荐
- BZOJ3294: [Cqoi2011]放棋子
Description Input 输入第一行为两个整数n, m, c,即行数.列数和棋子的颜色数.第二行包含c个正整数,即每个颜色的棋子数.所有颜色的棋子总数保证不超过nm. Output 输出 ...
- linux系统下yum源的搭建
1.建立挂载点 系统默认在 /mnt目录 1>创建挂载点 mkdir -p /mnt/cdrom 参数-p是需要时创建目标目录的上层目录,但即使这些目录已存在也不当作错误处理 2>查看 ...
- 深入浅出 - Android系统移植与平台开发(六)- 为Android启动加速
作者:唐老师,华清远见嵌入式学院讲师. Android的启动速度一直以来是他的诟病,虽然现在Android设备的硬件速度越来越快,但是随着新 版本的出现,其启动速度一直都比较慢,当然,作为程序员,我们 ...
- 三、图像移动《苹果iOS实例编程入门教程》
该app为应用的功能为动态移动动画 现版本 SDK 8.4 Xcode 运行Xcode 选择 Create a new Xcode project ->Single View Applicati ...
- css3动画在动作结束时保持该状态不变的解决办法
animation-fill-mode : none | forwards | backwards | both; none:不改变默认行为. forwards :当动画完成后,保持最后一个属性值(在 ...
- 关于IAP的破解
介绍 大概在今年7月份,有俄罗斯黑客破解了苹果的应用内付费(In-App Purchases),设备在不越狱的情况下就可以免费获得来自苹果官网App Store里应用的收费道具.受影响的产品众多,包括 ...
- select()函数 timval问题
如果select调用中设置了等待时间,那么每次调用时都需要重新对这个时间赋值.例如: struct timval tv; while(1) { ........; tv.tv_sec = 2; ...
- 《深入.NET平台和C# 编程》内测纠错记录
1. .NET框架的核心组件包括(BD)(选择两项) A.CTS (通用类型系统) B.CLR (公共语言运行时,.NET的基础) C.CLS (公共语言规范) D.FCL (框架类 ...
- 使用explain查看mysql查询执行计划
explain语句: 字段解释: type: all(全表扫描) ref() possible_keys: 预测使用什么列做为索引 key: 实际使用的key ...
- width,clientWidth,offsetWidth
<!DOCTYPE HTML> <html> <head> <meta http-equiv="Content-Type" content ...