# 仿QQ底部导航栏的自定义view
来源:互联网 发布:海南大学网络登录入口 编辑:程序博客网 时间:2024/06/05 16:55
仿QQ底部导航栏的自定义view
转载请注明出处:http://blog.csdn.net/zkjthinking/article/details/77043770
1.首先看看QQ的一个功能;
qq的这个交互效果还是蛮好的。所以自己尝试的撸一个;
绕着圆的圆周在转动;
来张图片吧;画图水平太low,将就看,我得确保我不被打死;
直接上代码;
@SuppressLint("AppCompatCustomView")public class CustomView extends View { private Paint mPaint; private int mWidth = 200; private int mHeight = 200; float facex = 100; float facey = 100; private float centerX = 100; private float centerY = 100; float rawX; float rawY; //指定一个脸的圆心,其他的图形根据这个来绘制 float FACE_CENTER = 100; private int color; public int getColor() { return color; } public void setColor(int color) { this.color = color; } public CustomView(Context context) { this(context, null); } public CustomView(Context context, @Nullable AttributeSet attrs) { this(context, attrs, 0); } public CustomView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); mPaint = new Paint(Paint.ANTI_ALIAS_FLAG); } @Override protected void onLayout(boolean changed, int left, int top, int right, int bottom) { super.onLayout(changed, left, top, right, bottom); } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); //这段设置自定义view的位置的; int mode = MeasureSpec.getMode(widthMeasureSpec); int size = MeasureSpec.getSize(widthMeasureSpec); int mode1 = MeasureSpec.getMode(heightMeasureSpec); int size1 = MeasureSpec.getSize(heightMeasureSpec); if (mode == MeasureSpec.AT_MOST && mode1 == MeasureSpec.AT_MOST){ setMeasuredDimension(mWidth,mHeight); }else if (mode == MeasureSpec.AT_MOST){ setMeasuredDimension(mWidth,size1); } else if (mode1 == MeasureSpec.AT_MOST){ setMeasuredDimension(size,mHeight); } } @SuppressLint("ResourceAsColor") @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); //画脸 mPaint.setColor(color); canvas.drawCircle(facex, facey, 50, mPaint); //画眼睛 mPaint.setColor(Color.WHITE); canvas.drawCircle((centerX - 20), (centerY - 10), 10, mPaint); canvas.drawCircle(centerX + 20, centerY - 10, 10, mPaint); //画嘴 mPaint.setStyle(Paint.Style.FILL); // 填充模式 canvas.drawArc(centerX - 25, centerY + 5, centerX + 25, centerY + 35, 0, 180, true, mPaint); //画身子 mPaint.setColor(color); canvas.drawArc(facex - 80, facey + 65, facex + 80, facey + 140, 0, -180, true, mPaint); } @Override public boolean onTouchEvent(MotionEvent event) { switch (event.getAction()) { case MotionEvent.ACTION_DOWN: rawX = event.getX(); rawY = event.getY(); break; case MotionEvent.ACTION_MOVE: rawX = event.getX(); rawY = event.getY(); //计算过程有更简单的算法。 float sin = (float) ((Math.abs(rawY - FACE_CENTER) / Math.sqrt(Math.abs(rawX - FACE_CENTER) *Math.abs(rawX - FACE_CENTER) + Math.abs(rawY - FACE_CENTER) * Math.abs(rawY - FACE_CENTER)) )); float cos = (float) ((Math.abs(rawX - FACE_CENTER) / Math.sqrt(Math.abs(rawX - FACE_CENTER) *Math.abs(rawX - FACE_CENTER) + Math.abs(rawY - FACE_CENTER) * Math.abs(rawY - FACE_CENTER)) )); float x = 20 * cos; float y = 20 * sin; float fx = 10 * cos; float fy = 10 * sin; if (rawX > FACE_CENTER && rawY > FACE_CENTER) { centerX = x + FACE_CENTER; centerY = y + FACE_CENTER; facex = FACE_CENTER + fx; facey = FACE_CENTER + fy; } else if (rawX > FACE_CENTER && rawY < FACE_CENTER) { centerX = x + FACE_CENTER; centerY = FACE_CENTER - y; facex = FACE_CENTER + fx; facey = FACE_CENTER - fy; } else if (rawY < FACE_CENTER && rawX < FACE_CENTER) { centerX = FACE_CENTER - x; centerY = FACE_CENTER - y; facex = FACE_CENTER - fx; facey = FACE_CENTER - fy; } else if (rawX < FACE_CENTER && rawY > FACE_CENTER) { centerX = FACE_CENTER - x; centerY = FACE_CENTER + y; facex = FACE_CENTER - fx; facey = FACE_CENTER + fy; } invalidate(); break; case MotionEvent.ACTION_UP: centerX = FACE_CENTER; centerY = FACE_CENTER; facex = FACE_CENTER; facey = FACE_CENTER; invalidate(); break; } return true; }}
2.看看效果;
好了这个效果出来了。可以用了。
第一次写博客,欢迎吐槽,不被打死就好;
阅读全文
2 0
- # 仿QQ底部导航栏的自定义view
- Fragment+自定义RadioButton实现底部导航栏,仿QQ
- 仿qq底部Tab导航
- 仿qq底部Tab导航
- 仿 QQ 底部 tab 导航
- 仿新版QQ底部导航栏动态拖动按钮
- 自定义 仿QQ底部菜单popWindow
- 底部导航栏(自定义View+ViewPager实现) android项目详解
- android仿微信底部导航栏+viewPager+自定义view
- 自定义控件-仿QQ导航栏-跟手指示条
- Android 仿QQ侧边栏,自定义view的学习 <Garry进阶(三)>
- 仿qq的view滚动到底部或顶部后可以松手回弹
- 仿qq底部的提示标记
- TabActivity自定义底部导航栏
- 自定义底部导航栏图标
- 仿qq侧滑删除的一个自定义View,独立的,不需要依赖其他的view
- 自己写的仿QQ空间导航栏
- Android自定义View之实现流行的底部菜单栏中间突起:高仿“咸鱼APP”的底部菜单。
- Dijkstra (邻接矩阵的另一种实现)
- 半深入理解CSS3 object-position/object-fit属性
- 《Python基础教程》学习笔记——函数
- Android学习(五)Service学习(下)
- swiper如何实现动画效果-小练习初级入门
- # 仿QQ底部导航栏的自定义view
- 1037. 在霍格沃茨找零钱(20)
- PHP解决json_encode中文变成unicode编码
- 大数据学习笔记:在eclipse上使用Ant插件实现自动编译打包
- Sublime Text 如何连接 FTP/SFTP ——图文详细教程
- SpringMVC请求流程
- scala初学main方法参数解析
- mysql中的视图小总
- java中final 与效率