下午无聊,之前本来一直想仿写支付宝的咻一咻功能

首先上效果图


然后创建一个自定义的 RounImageView 继承ImageView

package com.android.xiong.gridlayoutTest.customeview;

import com.android.xiong.gridlayoutTest.R;

import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Bitmap;
import android.graphics.Bitmap.Config;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.PorterDuff;
import android.graphics.PorterDuffXfermode;
import android.graphics.Rect;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.graphics.drawable.NinePatchDrawable;
import android.util.AttributeSet;
import android.widget.ImageView;

public class RounImageView extends ImageView {
private int mBorderThickness = 0;

private int defaultColor = 0xFFFFFFFF;

// 如果只有其中一个有值,则只画一个圆形边框

private int mBorderOutsideColor = 0;

private int mBorderInsideColor = 0;

// 控件默认长、宽

private int defaultWidth = 0;

private int defaultHeight = 0;
private Context mContext;

public RounImageView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
// 初始化View
mContext = context;
setCustomeAttributes(attrs);
}

public RounImageView(Context context, AttributeSet attrs) {
super(context, attrs);
//初始化View
mContext = context;
setCustomeAttributes(attrs);
}

public RounImageView(Context context) {
super(context);
mContext = context;
// TODO Auto-generated constructor stub
}

private void setCustomeAttributes(AttributeSet attrs) {
// 自定义属性
TypedArray mArray = mContext.obtainStyledAttributes(attrs,
R.styleable.roundedimageview);
mBorderThickness = mArray.getDimensionPixelSize(
R.styleable.roundedimageview_border_thickness, 0);
mBorderOutsideColor = mArray
.getColor(R.styleable.roundedimageview_border_outside_color,
defaultColor);
mBorderInsideColor = mArray.getColor(
R.styleable.roundedimageview_border_inside_color, defaultColor);

}
@Override
protected void onDraw(Canvas canvas) {
// TODO Auto-generated method stub
Drawable drawable=getDrawable();
if(drawable==null){
return;
}
if(getWidth()==0||getHeight()==0){
return ;
}
this.measure(0, 0);
if(drawable.getClass()==NinePatchDrawable.class){
return;
}
Bitmap bitmap=((BitmapDrawable)drawable).getBitmap();
Bitmap bitmap2=bitmap.copy(Config.ARGB_8888, true);
if(defaultWidth==0){
defaultWidth=getWidth();

}
if(defaultHeight==0){
defaultHeight=getHeight();
}
int radius=0;
if(mBorderInsideColor!=defaultColor&&mBorderOutsideColor!=defaultColor){
radius=(defaultWidth<defaultHeight?defaultWidth:defaultHeight)/2-2*mBorderThickness;
//画内圆
drawCircelBorder(canvas,radius+mBorderThickness/2,mBorderInsideColor);
//画外圆
drawCircelBorder(canvas,radius+mBorderThickness+mBorderOutsideColor/2,mBorderOutsideColor);

}else if(mBorderInsideColor!=defaultColor&&mBorderOutsideColor==defaultColor){
//定义一个画框
radius=(defaultWidth<defaultHeight?defaultWidth:defaultHeight)/2-mBorderThickness;
drawCircelBorder(canvas,radius+mBorderThickness/2,mBorderOutsideColor);

}else{
//没有边框
radius=(defaultWidth>defaultHeight?defaultWidth:defaultHeight)/2;
Bitmap boundBitmap=getCroppedRoundBitmap(bitmap2,radius);
canvas.drawBitmap(boundBitmap, defaultWidth/2-radius, defaultHeight/2-radius, null);

}

}
/**
* 裁剪后的圆形图片
* @param bitmap2
* @param radius
* @return
*/
private Bitmap getCroppedRoundBitmap(Bitmap bitmap2, int radius) {
// TODO Auto-generated method stub
Bitmap scaledSrcmp;
//直径
int diameter=radius*2;
//为了防止不等高,图片变形截取长方形中间位置的最的正方形图片
int bitWidth=bitmap2.getWidth();
int bitHeight=bitmap2.getHeight();
int squareWidth=0,squareHeight=0;
int a,b=0;
Bitmap squareBitmap;
//如果高大于宽最多等于宽
if(bitHeight>bitWidth){
squareWidth=squareHeight=bitWidth;
a=0;
b=(bitHeight-bitWidth)/2;
//截取正方形图片
squareBitmap=Bitmap.createBitmap(bitmap2, a, b, squareWidth, squareHeight);

//否则宽小于高最多等于高
}else if(bitHeight<bitWidth){
squareWidth=squareHeight=bitHeight;
a=(bitWidth-bitHeight)/2;
b=0;
squareBitmap=Bitmap.createBitmap(bitmap2, a, b, squareWidth, squareHeight);

}else{
squareBitmap=bitmap2;
}
if(squareBitmap.getWidth()!=diameter||squareBitmap.getHeight()!=diameter){
scaledSrcmp=Bitmap.createScaledBitmap(squareBitmap, diameter, diameter, true);

}else{
scaledSrcmp=squareBitmap;
}
   Bitmap output=Bitmap.createBitmap(scaledSrcmp.getWidth(), scaledSrcmp.getHeight(), Bitmap.Config.ARGB_8888);
   Canvas canvas=new Canvas(output);
   Paint paint=new Paint();
   Rect  rect=new Rect(0,0,scaledSrcmp.getWidth(), scaledSrcmp.getHeight());
   paint.setAntiAlias(true);
   paint.setFilterBitmap(true);
   paint.setDither(true);
   canvas.drawARGB(0, 0, 0, 0);
   canvas.drawCircle(scaledSrcmp.getWidth()/2, scaledSrcmp.getHeight()/2, scaledSrcmp.getWidth()/2, paint);
   paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));
   canvas.drawBitmap(scaledSrcmp, rect, rect, paint);
   bitmap2=null;
   squareBitmap=null;
   scaledSrcmp=null;
   
   
return output; 
}
    /**
     * 边缘画圆
     * @param canvas
     * @param i
     * @param mBorderOutsideColor2
     */
private void drawCircelBorder(Canvas canvas, int i, int mBorderOutsideColor2) {
// TODO Auto-generated method stub
Paint paint=new Paint();
/**去锯齿**/
paint.setAntiAlias(true);
paint.setFilterBitmap(true);
paint.setDither(true);
paint.setColor(mBorderOutsideColor2);
/*设置paint为空心*/
paint.setStyle(Paint.Style.STROKE);
/*设置paint外框宽度*/
paint.setStrokeWidth(mBorderThickness);
canvas.drawCircle(defaultWidth/2, defaultHeight/2, i, paint);
}
}

然后创建自定义的水波纹效果

package com.android.xiong.gridlayoutTest.customeview;

import java.util.ArrayList;
import java.util.List;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.util.AttributeSet;
import android.view.View;

public class WhewView extends View {
private Paint paint;
private int maxWidth = 255;
// 是否运行
private boolean isStarting = false;
private List<String> alphaList = new ArrayList<String>();
private List<String> startWidthList = new ArrayList<String>();

public WhewView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
// TODO Auto-generated constructor stub
init();
}

public WhewView(Context context, AttributeSet attrs) {
super(context, attrs);
// TODO Auto-generated constructor stub
init();
}点击打开链接
public WhewView(Context context) {
super(context);
// TODO Auto-generated constructor stub
init();
}

private void init() {
paint = new Paint();
// 设置博文的颜色
paint.setColor(0x0059ccf5);
alphaList.add("255");// 圆心的不透明度
startWidthList.add("0");
}

@Override
public void onDraw(Canvas canvas) {
super.onDraw(canvas);
setBackgroundColor(Color.TRANSPARENT);// 颜色:完全透明
// 依次绘制 同心圆
for (int i = 0; i < alphaList.size(); i++) {
int alpha = Integer.parseInt(alphaList.get(i));
// 圆半径
int startWidth = Integer.parseInt(startWidthList.get(i));
paint.setAlpha(alpha);
// 这个半径决定你想要多大的扩散面积
canvas.drawCircle(getWidth() / 2, getHeight() / 2, startWidth + 50,
paint);
// 同心圆扩散
if (isStarting && alpha > 0 && startWidth < maxWidth) {
alphaList.set(i, (alpha - 1) + "");
startWidthList.set(i, (startWidth + 1) + "");
}
}
if (isStarting
&& Integer
.parseInt(startWidthList.get(startWidthList.size() - 1)) == maxWidth / 5) {
alphaList.add("255");
startWidthList.add("0");
}
// 同心圆数量达到10个,删除最外层圆
if (isStarting && startWidthList.size() == 10) {
startWidthList.remove(0);
alphaList.remove(0);
}
// 刷新界面
invalidate();
}

// 执行动画
public void start() {
isStarting = true;
}

// 停止动画
public void stop() {
isStarting = false;
}

// 判断是都在不在执行
public boolean isStarting() {
return isStarting;
}

}

然后创建布局文件

activity_

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:imagecontrol="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >
    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content" >
      <!--这里改成你自己的包名-->

<com.android.xiong.gridlayoutTest.customeview.WhewView
            android:id="@+id/wv"
            android:layout_width="match_parent"
            android:layout_height="match_parent" />

<com.android.xiong.gridlayoutTest.customeview.RounImageView
            android:id="@+id/my_photo"
            android:layout_width="100dp"
            android:layout_height="100dp"
            android:layout_centerInParent="true"
            android:src="@drawable/myphoto"
            imagecontrol:border_inside_color="#bc0978"
            imagecontrol:border_outside_color="#ba3456"
            imagecontrol:border_thickness="1dp" />
    </RelativeLayout>

</LinearLayout>

最后创建一个活动窗口TestXActivity

package com.android.xiong.gridlayoutTest;

import com.android.xiong.gridlayoutTest.customeview.RounImageView;
import com.android.xiong.gridlayoutTest.customeview.WhewView;

import android.app.Activity;
import android.media.AudioManager;
import android.media.SoundPool;
import android.os.Bundle;
import android.os.Handler;
import android.view.View;
import android.view.View.OnClickListener;

public class TestXActivity extends Activity {
private WhewView wv;
   private RounImageView my_photo;
   private static final int Nou = 1;

// 声明一个SoundPool
   private SoundPool sp;
   // 定义一个整型用load();来设置suondIDf
   private int music;

private Handler handler = new Handler() {
       public void handleMessage(android.os.Message msg) {
           if (msg.what == Nou) {
               // 每隔10s响一次
               handler.sendEmptyMessageDelayed(Nou, 5000);
               sp.play(music, 1, 1, 0, 0, 1);
           }
       }
   };

@Override
   protected void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
       setContentView(R.layout.activity_roundimageview);

initView();
   }

private void initView() {

// 第一个参数为同时播放数据流的最大个数,第二数据流类型,第三为声音质量
       sp = new SoundPool(10, AudioManager.STREAM_SYSTEM, 5);
       // 把你的声音素材放到res/raw里,第2个参数即为资源文件,第3个为音乐的优先级
       music = sp.load(this, R.raw.hongbao_gq, 1);

wv = (WhewView) findViewById(R.id.wv);
       my_photo = (RounImageView) findViewById(R.id.my_photo);
       my_photo.setOnClickListener(new OnClickListener() {

@Override
           public void onClick(View v) {
               if(wv.isStarting()){
                   //如果动画正在运行就停止,否则就继续执行
                   wv.stop();
                   //结束进程
                   handler.removeMessages(Nou);
               }else{
                   // 执行动画
                   wv.start();
                   handler.sendEmptyMessage(Nou);
               }
           }
       });

}
   @Override
   protected void onDestroy() {
       // TODO Auto-generated method stub
       super.onDestroy();
       handler.removeMessages(Nou);
   }
}
最后在values下面atts.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
     <declare-styleable name="roundedimageview">
        <attr name="border_thickness" format="dimension" />
        <attr name="border_inside_color" format="color" />
        <attr name="border_outside_color" format="color"></attr>
    </declare-styleable>
    
</resources>

这样就大功告成!

我也是参考大侠写的!

咻一咻

模仿 Android支付宝咻一咻功能实现相关推荐

  1. Android特效专辑(十二)——仿支付宝咻一咻功能实现波纹扩散特效,精细小巧的View...

    Android特效专辑(十二)--仿支付宝咻一咻功能实现波纹扩散特效,精细小巧的View 先来看看这个效果 这是我的在Only上添加的效果,说实话,Only现在都还只是半成品,台面都上不了,怪自己技术 ...

  2. Android特效专辑(十二)——仿支付宝咻一咻功能实现波纹扩散特效,精细小巧的View

    Android特效专辑(十二)--仿支付宝咻一咻功能实现波纹扩散特效,精细小巧的View 先来看看这个效果 这是我的在Only上添加的效果,说实话,Only现在都还只是半成品,台面都上不了,怪自己技术 ...

  3. Android仿支付宝UI功能开发,Android 自定义view仿支付宝咻一咻功能

    支付宝上有一个咻一咻的功能,就是点击图片后四周有水波纹的这种效果,今天也写一个类似的功能. 效果如下所示: 思路: 就是几个圆的半径不断在变大,这个可以使用动画缩放实现,还有透明动画 还有就是这是好几 ...

  4. android 自定义view使用Canvas实现支付宝咻一咻功能

    昨天写了一篇关于支付宝咻一咻的功能,但是一直想通过使用Canvas来实现它,之前有的地方没想通,今天突然想通了,今天就自定义继承view而不是继承ViewGroup或者容器view来实现,但是也有个缺 ...

  5. 波纹扩散特效(仿支付宝咻一咻功能)

    波纹扩散效果之仿支付宝咻一咻功能实现波纹扩散特效,具体内容如下所示: 先来看看这个效果 这是我的在Only上添加的效果,说实话,Only现在都还只是半成品,台面都上不了,怪自己技术不行,也太懒了  P ...

  6. Android仿支付宝咻一咻动画

    Android特效专辑(十二)--仿支付宝咻一咻功能实现波纹扩散特效,精细小巧的View 先来看看这个效果 这是我的在Only上添加的效果,说实话,Only现在都还只是半成品,台面都上不了,怪自己技术 ...

  7. 咻一咻 android代码,支付宝咻一咻怎么用 Android帮你实现咻一咻

    对于之前最火的无外乎集五福了,而五福除了加十个好友获得外,最直接的途径就是支付宝的咻一咻了.那么咻一咻具体有哪些实现方式呢?下面我们将一一介绍这几种思路的实现过程. 1.自定义View实现咻一咻 那么 ...

  8. 前端C3属性模仿支付宝咻一咻

    使用c3的动画属性,来模拟支付宝的咻一咻功能,没有添加音频效果,可以使用H5的audio音频标签来实现音效播放 <!DOCTYPE html> <html> <head ...

  9. 支付宝福卡破解——咻一咻的ui怎么实现

    通过春节的无节操营销,支付宝的咻一咻功能让许多人手酸过.心酸过(没能中敬业福),在吐槽之余好奇的程序员总会猜想这ui怎么实现的呢? 在不看smali代码的情况下应该都会猜想咻一咻的ui实现是这样的:点 ...

最新文章

  1. 算法在哈啰顺风车中的实践应用
  2. PEI ZHI GUANLI GAISHU 1(liyi)
  3. 行将消失的烧瓦匠人:“仿古”热潮下迎新生曙光
  4. C#多线程学习 整理打包电子书
  5. Kata Container — Overview
  6. 2018年终总结(一只刚毕业的程序猿)
  7. 【CF1215E】Marbles【状压DP】
  8. 怎么退出python命令行cd找到txt文档_《python怎么读取txt文件》
  9. 【js】正则表达式(II)
  10. CPU内部实现“加,减,乘,除”过程
  11. 19.Linux/Unix 系统编程手册(上) -- 监控文件事件
  12. 微软原版Windows 8 原版镜像
  13. 前端项目开发流程(附思维导图PC)
  14. WIN7中如何卸载IE8或IE9
  15. 解决无法删除文件夹的情况
  16. [原创]Java Web——外卖配送系统/在线点餐系统
  17. win7计算机摄像头怎么打开,Win7笔记本摄像头怎么打开?Win7笔记本打开摄像头的方法...
  18. RHEL 5下iSCSI Initiator软件安装配置指导
  19. word表格之跨页断行
  20. 网站的广告位投放注意事项

热门文章

  1. STL源码剖析-第一章STL概论与版本简介
  2. 今年C++找工作这么这么难?
  3. ★★★★★★布尔教育 视频教程 【好学 推荐学习】 ★★★★★★
  4. 半导体器件物理【14】非平衡过剩载流子 —— 非平衡少数载流子浓度 、附加电导、扩散电流、漂移电流、总电流
  5. androidtv gms包_Android之GMS自我总结
  6. 字符串(varchar)和二进制(varbinary)互转
  7. “全球朋友,全球品牌,全球服务”民间全球沙龙在深圳举办;
  8. 亚马逊电商数据自动化管理接口平台ProductType格式展示
  9. 浅显的mysql优化
  10. 【Vue源码解读】万行源码详细解读