Android自定义View实现箭头沿圆转动实例代码

具体代码如下所示:

//MyCircleView类
public class MyCircleView extends View{
 //当前画笔画圆的颜色
 private int CurrenCircleBoundColor;
 private Paint paint;
 ////从xml中获取的颜色
 private int circleBundColor;
 private float circleBoundWidth;
 private float pivotX;
 private float pivotY;
 private float radius=130;
 private float currentDegree=0;
 private int currentSpeed=1;
 private boolean isPause=false;
 public MyCircleView(Context context) {
  super(context);
  initView(context);
 }
 public MyCircleView(Context context, @Nullable AttributeSet attrs) {
  super(context, attrs);
  initView(context);
  TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.MyCircleView);
  for (int i = 0; i < typedArray.getIndexCount(); i++) {
   //就是我们自定义的属性的资源id
   int attr = typedArray.getIndex(i);
   switch (attr){
    case R.styleable.MyCircleView_circlr_bound_color:
     circleBundColor = typedArray.getColor(attr, Color.RED);
     CurrenCircleBoundColor=circleBundColor;
     break;
    case R.styleable.MyCircleView_circlr_bound_width:
     circleBoundWidth = typedArray.getDimension(attr, 3);
     break;
   }
  }
 }
 public MyCircleView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
  super(context, attrs, defStyleAttr);
  initView(context);
 }
 private void initView(Context context){
  paint = new Paint();
 }
 public void setColor(int color){
  if (CurrenCircleBoundColor!=color){
   CurrenCircleBoundColor=color;
  }else {
   CurrenCircleBoundColor=circleBundColor;
  }
 }
 @Override
 protected void onDraw(Canvas canvas) {
  super.onDraw(canvas);
  paint.setAntiAlias(true);
  paint.setColor(CurrenCircleBoundColor);
  paint.setStrokeWidth(circleBoundWidth);
  paint.setStyle(Paint.Style.STROKE);
  pivotX = getWidth() / 2;
  pivotY = getHeight() / 2;
  canvas.drawCircle(pivotX,pivotY,radius,paint);
  canvas.save();
  //旋转画布 , 如果旋转的的度数大的话,视觉上看着是旋转快的
  canvas.rotate(currentDegree,pivotX,pivotY);
  //提供了一些api可以用来画线(画路径)
  Path path = new Path();
  //从哪开始画 从A开始画
  path.moveTo(pivotX+radius,pivotY);
  //从A点画一个直线到D点
  path.lineTo(pivotX+radius-20,pivotY-20);
  //从D点画一个直线到B点
  path.lineTo(pivotX+radius,pivotY+20);
  //从B点画一个直线到C点
  path.lineTo(pivotX+radius+20,pivotY-20);
  //闭合 -- 从C点画一个直线到A点
  path.close();
  paint.setStyle(Paint.Style.FILL);
  paint.setColor(Color.BLACK);
  canvas.drawPath(path,paint);
  canvas.restore();
  //旋转的度数一个一个度数增加, 如果乘以一个速度的话,按一个速度速度增加
  currentDegree+=1*currentSpeed;
  if (!isPause){
   invalidate();
  }
 }
 public void speed(){
  ++currentSpeed;
  if (currentSpeed>=10){
   currentSpeed=10;
   Toast.makeText(getContext(),"我比闪电还快",Toast.LENGTH_SHORT).show();
  }
 }
 public void slowDown(){
  --currentSpeed;
  if (currentSpeed<=1){
   currentSpeed=1;
  }
 }
 public void pauseOrStart(){
  //如果是开始状态的话去重新绘制
  if (isPause){
   isPause=!isPause;
   invalidate();
  }else {
   isPause=!isPause;
  }
 }
}
//主页面
public class MainActivity extends AppCompatActivity {
 //全局变量
 private MyCircleView my_view;
 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);
  //找控件
  my_view = (MyCircleView) findViewById(R.id.my_view);
 }
 public void onClick(View view){
  my_view.setColor(Color.BLUE);
 }
 public void add(View view){
  my_view.speed();
 }
 public void slow(View view){
  my_view.slowDown();
 }
 public void pauseOrStart(View view){
  my_view.pauseOrStart();
 }
}
主页面布局
<RelativeLayout
 xmlns:android="http://schemas.android.com/apk/res/android"
 xmlns:tools="http://schemas.android.com/tools"
 xmlns:app="http://schemas.android.com/apk/res-auto"
 android:layout_width="match_parent"
 android:layout_height="match_parent"
 tools:context="com.example.lx_20170928.MainActivity">
 <Button
  android:id="@+id/set_color_btn"
  android:layout_width="match_parent"
  android:layout_height="wrap_content"
  android:layout_centerHorizontal="true"
  android:onClick="onClick"
  android:text="设置颜色" />
 <Button
  android:id="@+id/add"
  android:layout_width="match_parent"
  android:layout_height="wrap_content"
  android:layout_below="@id/set_color_btn"
  android:layout_centerHorizontal="true"
  android:onClick="add"
  android:text="加速" />
 <Button
  android:id="@+id/slow"
  android:layout_width="match_parent"
  android:layout_height="wrap_content"
  android:layout_below="@+id/add"
  android:layout_centerHorizontal="true"
  android:onClick="slow"
  android:text="减速" />
 <Button
  android:id="@+id/pause_or_start"
  android:layout_width="match_parent"
  android:layout_height="wrap_content"
  android:layout_below="@+id/slow"
  android:layout_centerHorizontal="true"
  android:onClick="pauseOrStart"
  android:text="暂定/开始" />
  <com.example.lx_20170928.MyCircleView
   android:layout_width="wrap_content"
   android:layout_height="wrap_content"
   android:id="@+id/my_view"
   android:layout_centerInParent="true"
   app:circlr_bound_color="@color/colorAccent"
   app:circlr_bound_width="3dp"
   />
</RelativeLayout>
//在values建一个attrs.xml
<resources>
 <declare-styleable name="MyCustomCircleArrowView">
  <attr name="circlr_bound_width" format="dimension"></attr>
  <attr name="circlr_bound_color" format="color"></attr>
 </declare-styleable>
</resources>

效果图如下所示:

总结

以上所述是小编给大家介绍的Android自定义View实现箭头沿圆转动实例代码,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对我们网站的支持!

(0)

相关推荐

  • Android自定义ViewGroup实现带箭头的圆角矩形菜单

    本文和大家一起做一个带箭头的圆角矩形菜单,大概长下面这个样子: 要求顶上的箭头要对准菜单锚点,菜单项按压反色,菜单背景色和按压色可配置. 最简单的做法就是让UX给个三角形的图片往上一贴,但是转念一想这样是不是太low了点,而且不同分辨率也不太好适配,干脆自定义一个ViewGroup吧! 自定义ViewGroup其实很简单,基本都是按一定的套路来的. 一.定义一个attrs.xml 就是声明一下你的这个自定义View有哪些可配置的属性,将来使用的时候可以自由配置.这里声明了7个属性,分别是:箭头宽

  • Android自定义View实现箭头沿圆转动实例代码

    具体代码如下所示: //MyCircleView类 public class MyCircleView extends View{ //当前画笔画圆的颜色 private int CurrenCircleBoundColor; private Paint paint; ////从xml中获取的颜色 private int circleBundColor; private float circleBoundWidth; private float pivotX; private float piv

  • Android自定义View圆形和拖动圆、跟随手指拖动效果

    单纯的自定义一个圆非常简单 只需要几步就完成 拖动圆添加实现触摸事件即可 我在第一次自定义View圆遇到的几个Bug: 1.拖动圆的话在xml里面设置的自定义圆的宽和高是它能活动的空间的大小 不是圆控件的大小 如果你定义了100dp 拖动它的时候超过100dp这个距离这个圆就会看不见 就像下面这样 如果想活动于整个屏幕直接给宽和高match_parent属性就好了 2.我在定义充满属性match_parent的时候运行会报错,什么方法都用了就是不行,耐心等待过一会就好了-有可能是studio没来

  • Android自定义View圆形和拖动圆跟随手指拖动

    单纯的自定义一个圆非常简单 只需要几步就完成 拖动圆添加实现触摸事件即可 我在第一次自定义View圆遇到的小问题: 1.拖动圆的话在xml里面设置的自定义圆的宽和高是它能活动的空间的大小 不是圆控件的大小 如果你定义了100dp 拖动它的时候超过100dp这个距离这个圆就会看不见 就像下面这样 如果想活动于整个屏幕直接给宽和高match_parent属性就好了 2.在布局里自定的view会提示编译 点击Build编译一下就好了 下面开始写代码: 先是单纯的创建一个圆形 创建一个类继承View 实

  • Android自定义View 仿QQ侧滑菜单的实现代码

    先看看QQ的侧滑效果 分析一下 先上原理图(不知道能否表达的清楚 ==) -首先这里使用了 Android 的HorizontalScrollView 水平滑动布局作为容器,当然我们需要继承它自定义一个侧滑视图 - 这个容器里面有一个父布局(一般用LinerLayout,本demo用的是),这个父布局里面有且只有两个子控件(布局),初始状态菜单页的位置在Y轴上存在偏移这样可以就可以形成主页叠在菜单页的上方的视觉效果:然后在滑动的过程程中 逐渐修正偏移,最后菜单页和主页并排排列.原理搞清了实现起来

  • Android自定义View实现等级滑动条的实例

     Android自定义View实现等级滑动条的实例 实现效果图: 思路: 首先绘制直线,然后等分直线绘制点: 绘制点的时候把X值存到集合中. 然后绘制背景图片,以及图片上的数字. 点击事件down的时候,换小图片为大图片.move的时候跟随手指移动. up的时候根据此时的X计算最近的集合中的点,然后自动吸附回去. 1,自定义属性 <?xml version="1.0" encoding="utf-8"?> <resources> <de

  • Android使用自定义View实现饼状图的实例代码

    本文讲述了Android使用自定义View实现饼状图的实例代码.分享给大家供大家参考,具体如下: 1.效果图 2.代码实现 public class PieChartView extends View { private Paint mPaint; private List<PieData>pieDataList; // 饼状图初始绘制角度 private float mStartAngle = 0; public PieChartView(Context context) { this(co

  • Android 自定义弹出菜单和对话框功能实例代码

    Android 开发当中,可能会存在许多自定义布局的需求,比如自定义弹出菜单(popupWindow),以及自定义对话框(Dialog). 话不多说,直接上图片. 先讲第一种,自定义PopUpWindow 1.popupWindow protected void showPopWindow(View view, final int pos){ WindowManager wm= (WindowManager) myContext.getSystemService(Context.WINDOW_S

  • Android中View跟随手指滑动效果的实例代码

    本文讲述了Android中View跟随手指滑动效果的实例代码.分享给大家供大家参考,具体如下: 1.android View 主要6种滑动方法,分别是 layout() offsetLeftAndRight()和offsetTopAndBottom() LayoutParams scrollBy()和 scrollTo() Scroller 动画 2.实现效果图 3.自定义中使用layout()方法实习view的滑动 public class MoveView extends View { pr

  • Android自定义View制作动态炫酷按钮实例解析

    普通按钮也就那么几种样式,看着都审美疲劳,先放效果图: 你会不会以为这个按钮是集结了很多动画的产物,我告诉你,并没有.所有的实现都是基于自定义View,采用最底层的onDraw一点一点的画出来的.没有采用一丁点的动画.虽然演示时间很短,但是要完成这么多变化,还是挺吃力. 首先讲解用法: public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState)

  • Android自定义按周签到打卡功能实例代码

    前言 之前实现过<Android可签到的日历控件>的功能,跟这篇一样都是实现签到打卡功能,这篇实现的是按月进行打卡做标识,本篇内容实现的按周进行签到打卡. 实现签到规则如下: 1.连续签到7天,即可获得额外积分奖励. 2.连续签到记录在第8天开始时将清零重新计算. 3.如果中断签到,连续签到记录也将清零. 实现步骤: 1.效果图 2.自定义签到打卡View 3.主程序逻辑处理 4.主界面 5.签到bean 6.总结 实现过程: 1.效果图 2.自定义签到打卡View /** * descrip

随机推荐