自定义磁铁特效View
来源:互联网 发布:兄弟连java培训多少钱 编辑:程序博客网 时间:2024/05/17 07:12
首先声明下:代码是群里一个哥们的代码,我只是拿来研究记录下;============================================================1.抗锯齿化的两种方法:
在画图的时候,图片如果旋转或缩放之后,总是会出现那些华丽的锯齿。其实Android自带了解决方式。 方法一:给Paint加上抗锯齿标志。然后将Paint对象作为参数传给canvas的绘制方法。方法二:给Canvas加上抗锯齿标志。有些地方不能用paint的,就直接给canvas加抗锯齿,更方便。
- paint.setAntiAlias(true);
- canvas.setDrawFilter(new PaintFlagsDrawFilter(0, Paint.ANTI_ALIAS_FLAG|Paint.FILTER_BITMAP_FLAG));
2.自定义磁悬浮特效的ImageView
{ private boolean onAnimation = true; private int rotateDegree = 10; private boolean isFirst = true; private float minScale = 0.95f; private int vWidth; private int vHeight; private boolean isFinish = true, isActionMove = false, isScale = false; private Camera camera; boolean XbigY = false; float RolateX = 0; float RolateY = 0; OnViewClick onclick = null; public MyImageView(Context context) { super(context); // TODO Auto-generated constructor stub camera = new Camera(); } public MyImageView(Context context, AttributeSet attrs) { super(context, attrs); // TODO Auto-generated constructor stub camera = new Camera(); } public void SetAnimationOnOff(boolean oo) { onAnimation = oo; } public void setOnClickIntent(OnViewClick onclick) { this.onclick = onclick; } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); if (isFirst) { isFirst = false; init(); } canvas.setDrawFilter(new PaintFlagsDrawFilter(0, Paint.ANTI_ALIAS_FLAG | Paint.FILTER_BITMAP_FLAG)); } public void init() { vWidth = getWidth() - getPaddingLeft() - getPaddingRight(); vHeight = getHeight() - getPaddingTop() - getPaddingBottom(); Drawable drawable = getDrawable(); BitmapDrawable bd = (BitmapDrawable)drawable; bd.setAntiAlias(true); } @Override public boolean onTouchEvent(MotionEvent event) { super.onTouchEvent(event); if (!onAnimation) return true; switch (event.getAction() & MotionEvent.ACTION_MASK) { case MotionEvent.ACTION_DOWN: float X = event.getX(); float Y = event.getY(); RolateX = vWidth / 2 - X; RolateY = vHeight / 2 - Y; XbigY = Math.abs(RolateX) > Math.abs(RolateY) ? true : false; isScale = X > vWidth / 3 && X < vWidth * 2 / 3 && Y > vHeight / 3 && Y < vHeight * 2 / 3; isActionMove = false; if (isScale) { handler.sendEmptyMessage(1); } else { rolateHandler.sendEmptyMessage(1); } break; case MotionEvent.ACTION_MOVE: float x = event.getX(); float y = event.getY(); if (x > vWidth || y > vHeight || x < 0 || y < 0) { isActionMove = true; } else { isActionMove = false; } break; case MotionEvent.ACTION_UP: if (isScale) { handler.sendEmptyMessage(6); } else { rolateHandler.sendEmptyMessage(6); } break; } return true; } public interface OnViewClick { public void onClick(); } private Handler rolateHandler = new Handler() { private Matrix matrix = new Matrix(); private float count = 0; @Override public void handleMessage(Message msg) { super.handleMessage(msg); matrix.set(getImageMatrix()); switch (msg.what) { case 1: count = 0; BeginRolate(matrix, (XbigY ? count : 0), (XbigY ? 0 : count)); rolateHandler.sendEmptyMessage(2); break; case 2: BeginRolate(matrix, (XbigY ? count : 0), (XbigY ? 0 : count)); if (count < getDegree()) { rolateHandler.sendEmptyMessage(2); } else { isFinish = true; } count++; count++; break; case 3: BeginRolate(matrix, (XbigY ? count : 0), (XbigY ? 0 : count)); if (count > 0) { rolateHandler.sendEmptyMessage(3); } else { isFinish = true; if (!isActionMove && onclick != null) { onclick.onClick(); } } count--; count--; break; case 6: count = getDegree(); BeginRolate(matrix, (XbigY ? count : 0), (XbigY ? 0 : count)); rolateHandler.sendEmptyMessage(3); break; } } }; private synchronized void BeginRolate(Matrix matrix, float rolateX, float rolateY) { // Bitmap bm = getImageBitmap(); int scaleX = (int)(vWidth * 0.5f); int scaleY = (int)(vHeight * 0.5f); camera.save(); camera.rotateX(RolateY > 0 ? rolateY : -rolateY); camera.rotateY(RolateX < 0 ? rolateX : -rolateX); camera.getMatrix(matrix); camera.restore(); // 控制中心点 if (RolateX > 0 && rolateX != 0) { matrix.preTranslate(-vWidth, -scaleY); matrix.postTranslate(vWidth, scaleY); } else if (RolateY > 0 && rolateY != 0) { matrix.preTranslate(-scaleX, -vHeight); matrix.postTranslate(scaleX, vHeight); } else if (RolateX < 0 && rolateX != 0) { matrix.preTranslate(-0, -scaleY); matrix.postTranslate(0, scaleY); } else if (RolateY < 0 && rolateY != 0) { matrix.preTranslate(-scaleX, -0); matrix.postTranslate(scaleX, 0); } setImageMatrix(matrix); } private Handler handler = new Handler() { private Matrix matrix = new Matrix(); private float s; int count = 0; @Override public void handleMessage(Message msg) { super.handleMessage(msg); matrix.set(getImageMatrix()); switch (msg.what) { case 1: if (!isFinish) { return; } else { isFinish = false; count = 0; s = (float)Math.sqrt(Math.sqrt(minScale)); BeginScale(matrix, s); handler.sendEmptyMessage(2); } break; case 2: BeginScale(matrix, s); if (count < 4) { handler.sendEmptyMessage(2); } else { isFinish = true; if (!isActionMove && onclick != null) { onclick.onClick(); } } count++; break; case 6: if (!isFinish) { handler.sendEmptyMessage(6); } else { isFinish = false; count = 0; s = (float)Math.sqrt(Math.sqrt(1.0f / minScale)); BeginScale(matrix, s); handler.sendEmptyMessage(2); } break; } } }; private synchronized void BeginScale(Matrix matrix, float scale) { int scaleX = (int)(vWidth * 0.5f); int scaleY = (int)(vHeight * 0.5f); matrix.postScale(scale, scale, scaleX, scaleY); setImageMatrix(matrix); } public int getDegree() { return rotateDegree; } public void setDegree(int degree) { rotateDegree = degree; } public float getScale() { return minScale; } public void setScale(float scale) { minScale = scale; }}
3.图片效果:
正常:
点左:
点中:
当然,点右、上、下的效果类似于点左,不在此贴图
3.源码:
磁铁特效源码
- 自定义磁铁特效View
- 自定义View实现视差特效
- 自定义View之视差特效
- 自定义View实现视差特效
- Android 自定义View(一) 内容切换特效
- 自定义view实战笔记--视差特效
- view 特效
- 自定义特效VIew第一弹之竖直TextView
- Android 自定义View高级特效,神奇的贝塞尔曲线
- Android 自定义View高级特效,神奇的贝塞尔曲线
- Android 自定义view:实现ListView下拉的视差特效
- Android 自定义View漫飞舞超炫超浪漫特效
- Android自定义控件(特效三) 自定义View实现图片验证码
- 自定义View实现手机qq5.X的抽屉特效和聊天界面联系人左滑功能
- Android自定义View之有动画特效带清除按钮的输入框
- 自定义View:实现炫酷的点赞特效(仿即刻)
- 自定义控件-视觉特效
- 自定义控件:视差特效
- 《大数据时代》书评及书摘
- 基于Boost::asio库的网络编程实现基础
- 适配器模式
- js实现段落分页
- python--调用系统命令
- 自定义磁铁特效View
- UVa 409 Excuses, Excuses! (字符串匹配)
- 查看JDK版本是32位还是64位
- FusionChart实现漏斗图
- vc++ 6.0 堆栈
- 2014百度校园招聘面试题
- Android 数据存储与读取:SQLite
- DevBytes: Bitmap Scaling
- 追溯源码解决android疑难问题2--寻找丢失的焦点