本来不准备记在这里,但是再次观看源码时,发现自己可能写不出来了所以干脆来记下来!
自定义控件——仿Toast的Dialog(带圆角图片)
俗话说有图有真相,我们先来看一下效果图!就在下面!下面的全是自定义控件,只是把几个合在一起了!这里我们只阐述这个“Toast”吧

第一步.建立一个类继承自Dialog(操作类+布局文件)
不解释直接上源码
package com.example.administrator.mygifttalk.view;
import android.app.Dialog;
import android.content.Context;
import android.os.Handler;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
import com.example.administrator.mygifttalk.R;
/**
* Created by Administrator on 16-3-30.
*/
public class MyDialogToast extends Dialog {
public MyDialogToast(Context context) {
super(context);
}
public MyDialogToast(Context context, int themeResId) {
super(context, themeResId);
MyCircleIcon v= (MyCircleIcon) findViewById(R.id.IconToastIcon);
}
/**
* 创建一个MyDialogToast的帮助类
*/
public static class Builder {
private Context context;
private String message;
private View contentView;
public Builder(Context context) {
this.context = context;
}
/**
* Set the Dialog message from String
*
* @param message
* @return
*/
public Builder setMessage(String message) {
this.message = message;
return this;
}
/**
* Set the Dialog message from Resource
*
* @param message
* @return
*/
public Builder setMessage(int message) {
this.message = context.getText(message).toString();
return this;
}
/**
* set a custom content view for the Dialog.
* If a message is set ,the contentView is not added to the Dialog;
*
* @param v
* @return
*/
public Builder setContentView(View v) {
this.contentView = v;
return this;
}
/**
* Create a custom dialog
*
* @return
*/
public MyDialogToast create() {
LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
MyDialogToast myDialogToast = new MyDialogToast(context, R.style.dialog);
View view = inflater.inflate(R.layout.my_dialog_toast, null);
myDialogToast.addContentView(view, new LinearLayout.LayoutParams(
LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT));
if (message != null) {
TextView v = (TextView) view.findViewById(R.id.tvToastMessage);
v.setText(message);
}
myDialogToast.setContentView(view);
return myDialogToast;
}
}
/**
* 在自己里面设置一个静态类封装调用自己的方法,便于外类直接调用
* @param context 传入调用类的context
* @param str 设置显示的文字
* @param time 设置显示时间,为防止主线程ANR,所输入的时间大于5000则强制转为4999ms
*/
public static void Show(String str, int time,Context context) {
if (time < 5000) {
MyDialogToast.Builder builder=new MyDialogToast.Builder(context);
builder.setMessage(str);
final MyDialogToast dialogToast = builder.create();
dialogToast.show();
Handler handler = new Handler();
handler.postDelayed(new Runnable() {
@Override
public void run() {
dialogToast.dismiss();
}
}, time);
}else {
time=4999;
}
}
}
目前这里用到的其它文件就是dialog的自定义布局这里代码不多直接贴出来!不然没有高亮显示
但是到了这里还是不算什么这里的效果顶多是一个dialog,那么如何来完成圆角和深灰色透明的背景色呢,答案其实很简单,就是在drawable文件夹和value文件夹下面各自自定义一个shape文件和一个style文件国际惯例上图上代码——>
第二步.建立修饰文件(shape和style)
drawable->shape_dialog.xml
这个shape文件干了什么呢?就两件事,画圆角和画背景颜色,这里我采用的数值是深色透明颜色代码<color name="colorDialogToast">#8f000000</color>
value->my_dialog_toast_style.xml
![]()
这里引用资源时Android Studio会有感叹号,但是不影响效果,不必恐慌,不理会就行!
到了这里基本上就完工了?并没有,别忘了上面还有个画圆的图片的自定义控件啊!
那么接下来我们就自定义这个控件!其实也非常的简单,本来准备继承ImagView使用其自定义控件,但是我没有成功获取其src,这里不再赘述:继续干来让我们上干货——》
第一步:当然是建立操作类+自定义布局+自定义属性喽
1.那么我们来建立一个操作类
package com.example.administrator.mygifttalk.view;
import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.PorterDuff;
import android.graphics.PorterDuffXfermode;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.ImageView;
import android.widget.LinearLayout;
import com.example.administrator.mygifttalk.R;
/**
* Created by Administrator on 16-3-30.
*/
public class MyCircleIcon extends LinearLayout{
private int Icon;
private ImageView myIcon;
public MyCircleIcon(Context context) {
this(context,null,0);
}
public MyCircleIcon(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public MyCircleIcon(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
TypedArray a=context.obtainStyledAttributes(attrs,R.styleable.MyCircleIcon);
Icon=a.getResourceId(R.styleable.MyCircleIcon_Src,R.mipmap.eat_huaji);
init(context);
a.recycle();
}
private void init(Context context) {
View v = LayoutInflater.from(context).inflate(R.layout.my_circle_icon,this,true);
myIcon = (ImageView) v.findViewById(R.id.myIcon);
setMyCircleIcon(Icon);
}
public void setMyCircleIcon(int Icon) {
float radiu;
Bitmap bitmap=BitmapFactory.decodeResource(getResources(),Icon);
Bitmap bmap=Bitmap.createBitmap(bitmap.getWidth(), bitmap.getHeight(), Bitmap.Config.ARGB_8888);
Paint paint=new Paint();
paint.setAntiAlias(true);
paint.setColor(Color.WHITE);
paint.setStrokeWidth(5);
// BitmapDrawable bd = (BitmapDrawable) myImageDrawable;
// Bitmap bitmap=bd.getBitmap();
Canvas canvas=new Canvas(bmap);
float cx=bitmap.getWidth();
float cy=bitmap.getHeight();
cx=cx/2;
cy=cy/2;
if(cx>cy){
radiu=cy;
}else {
radiu=cx;
}
canvas.drawCircle(cx, cy, radiu, paint);
paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));
canvas.drawBitmap(bitmap, 0, 0, paint);
myIcon.setImageBitmap(bmap);
}
}
2.我们再建立一个自定义布局
3.再在values文件夹下建立一个自定义属性xml文件
到这里为止操作类中的setMyCircleIcon(int Icon)方法就给我们的图片画好了圆!至于有的人说把控件画圆,那么可能只有在onDraw()方法里画一个圆了吧反正我不会,我只会把图片画圆,这个画圆的思想是比较获取到的图片宽高,谁最短就用谁做直径画圆,自然就得到如圆图了了!
大结局终于来临了!写到这里调用的方法就及其简单了!
![]()
只此一句便可召唤出文章开头图片的效果!







浙公网安备 33010602011771号