Android好奇宝宝_番外篇_看脸的世界_06
public BoWenView(Context context, AttributeSet attrs) { super(context, attrs); init(); }
private void init() { // 画笔初始化 mPaint = new Paint(); mPaint.setAntiAlias(true); // 发送消息,开始动画循环 mHandler.sendEmptyMessage(0); }
下面是一些需要View大小作为参数的初始化,我是重写了onSizeChanged方法,该方法顾名思义就是View的大小被改变时会被调用,第一次加入View树时也会被调用,只是此时的旧值都为0而已:
protected void onSizeChanged(int w, int h, int oldw, int oldh) { super.onSizeChanged(w, h, oldw, oldh); // 计算半径=较长边的1/12加1 radius = w > h ? w / 12 + 1 : h / 12 + 1; // 计算中心坐标 cX = w / 2; cY = h / 2; // 初始化环形着色器 radialGradient = new RadialGradient(w / 2, h / 2, radius, 0X88FFFFFF, 0XAAFFFFFF, TileMode.REPEAT); mPaint.setShader(radialGradient); // 初始化中心图像的位置 bitmapRectF = new RectF(cX - radius, cY - radius, cX + radius, cY + radius); }
要实现我们的效果需要用的是环形着色器,另外还有线性的和圆形的,更多内容可以查看上面推荐的博客。
private Bitmap centerBitmap; public void setCenterBitmap(Bitmap bitmap) { centerBitmap = bitmap; invalidate(); }
Handler mHandler = new Handler(new Handler.Callback() { @Override public boolean handleMessage(Message msg) { Log.e("Bowen", "handleMessage"); if (scale >= 6) { scale = 0; } scale++; invalidate(); mHandler.sendEmptyMessageDelayed(0, 500); return false; } });
通过scale的值来控制要画的圆的大小。
protected void onDraw(Canvas canvas) { //画圆,根据sacle来控制大小 canvas.drawCircle(cX, cY, cX > cY ? cX * scale / 6 : cY * scale / 6, mPaint); //有设置图像的话就在中间画出来 if (centerBitmap != null) { canvas.drawBitmap(centerBitmap, null, bitmapRectF, null); } }
protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //设置中心图像 ((BoWenView) findViewById(R.id.bowen)).setCenterBitmap(BitmapFactory.decodeResource(getResources(),R.drawable.dun)); }
效果出来了,万事大吉,撸两盘然后睡觉去了。
如果是在Activity中使用Handler也是同样的道理,即Handler为Activity的非静态内部类,即Handler引用了Activity,即Handler的无法回收同样将导致Activity的无法回收。
protected void onWindowVisibilityChanged(int visibility) { super.onWindowVisibilityChanged(visibility); if (visibility == View.GONE) { Log.e("Bowen", "Window-GONE"); mHandler.removeMessages(0); } else if (visibility == View.VISIBLE) { Log.e("Bowen", "Window-VISIBLE"); mHandler.sendEmptyMessage(0); } }
记得把前面在init方法中发送消息的语句去掉:
private void init() { // 画笔初始化 mPaint = new Paint(); mPaint.setAntiAlias(true); // 发送消息,开始动画循环 //mHandler.sendEmptyMessage(0); }
//我就是传说中的 //略...
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。