GVKun编程网logo

ichart.js绘制虚线、平均分虚线效果的实现代码(js画虚线)

10

对于ichart.js绘制虚线、平均分虚线效果的实现代码感兴趣的读者,本文将会是一篇不错的选择,我们将详细介绍js画虚线,并为您提供关于Android实现代码画虚线边框背景效果、Android实现渐变

对于ichart.js绘制虚线、平均分虚线效果的实现代码感兴趣的读者,本文将会是一篇不错的选择,我们将详细介绍js画虚线,并为您提供关于Android实现代码画虚线边框背景效果、Android实现渐变色的圆弧虚线效果、android绘制虚线、Android自定义View实现绘制虚线的方法详解的有用信息。

本文目录一览:

ichart.js绘制虚线、平均分虚线效果的实现代码(js画虚线)

ichart.js绘制虚线、平均分虚线效果的实现代码(js画虚线)

ichart.js绘制虚线、平均分虚线效果的实现代码

rush:js;"> var Data=new Array(); Data[0] = { labels : ["第一单元","第二单元","第三单元","第四单元","第五单元"],datasets : [ { name : '优秀率',color:'#1dbcfe',line_width:4,value : [80,75,92,62,0] } ] } Data[1] = { labels : ["第一单元",value : [50,11,77,90] } ] } Data[2] = { labels : ["第一单元",51,32,44,80] } ] }
var _bodyWidth=$('body').width()-16; 
$('.item').each(function(i){ 
  var _id=$(this).find('.canvas-wrap').attr('id'); 
  var chart = new iChart.LineBasic2D({ 
    render : _id,data: Data[i].datasets,align:'center',border:0,width : _bodyWidth*2,height : _bodyWidth*1.2,background_color:'#fafafa',animation : true,//开启过渡动画 
    animation_duration:600,//600ms完成动画 

    sub_option : { 
      smooth : true,hollow:false,hollow_inside:false,point_size:16,listeners : { 
        parseText : function(r,t) { 
          return t+'%'; 
        } 
      },label:{fontsize:24,color:'#333'},},coordinate:{ 
      width:_bodyWidth*1.6,valid_width:_bodyWidth*1.4,height:_bodyWidth*1.6*.5,striped_factor : 0.18,axis:{ 
        color:'#aaa',width:[0,8,0] 
      },scale:[{ 
         position:'left',start_scale:0,end_scale:100,scale_space:20,scale_size:2,scale_enable : false,label : {color:'#999',fontsize:24},scale_color:'#999'
      },{ 
         position:'b<a href="https://www.jb51.cc/tag/ott/" target="_blank">ott</a>om',labels:Data[i].labels 
      }] 
    } 

  }); 
  /** 
   *<a href="https://www.jb51.cc/tag/zidingyi/" target="_blank">自定义</a>组件,画平均线。 
   */
  chart.plugin(new iChart.Custom({ 
      drawFn:function(){ 
        /** 
         *计算平均值的高度(坐标Y值) 
         */ 
         var _total=0; 
        $.each(Data[i].datasets[0].value,function(i,val){ 
          _total+=val; 
        }); 
        var avg = _total/Data[i].datasets[0].value.length,//计算出的平均分写<a href="https://www.jb51.cc/tag/zaizhe/" target="_blank">在这</a>即可 
          coo = chart.getCoordinate(),x = coo.get('originx'),W = coo.width,S = coo.getScale('left'),H = coo.height,h = (avg - S.start) * H / S.<a href="https://www.jb51.cc/tag/dis/" target="_blank">dis</a>tance,y = chart.y + H - h; 
        for(xi=x;xi<=(x+W);xi=xi+32){ 
          chart.target.line(xi,y,xi+16,2,'#fe941c'); 
        } 
        chart.target.textAlign('start') 
        .textBaseline('middle') 
        .textFont('500 20px Verdana') 
        .fillText('平均战胜率'+avg+'%',x+W-100,y-20,false,'#fe941c'); 
      } 
  })); 
  chart.draw(); 
});</pre>

以上代码是绘制多个折线图的js示例,以及在每个折线图内绘制平均分虚线的方法。

ichart.js是一个十分不错的图标绘制js,缺点是在移动端需要先设置两倍大小,再用css和js手动缩小到正常范围,以使其在屏幕上保持高清。

官网有绘制平均线的示例,但是没有虚线的,而一般为了不混淆,平均线都是使用虚线绘制的。这里我只是循环绘制了n端直线,算是一个变通的方法。如有更好的方法请留言哦谢谢。

以上这篇ichart.js绘制虚线、平均分虚线效果的实现代码就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持小编。

Android实现代码画虚线边框背景效果

Android实现代码画虚线边框背景效果

实现如下边框效果:

虚线画效果,可以使用Android中的xml来做。下面话不多说,直接上代码:

<RelativeLayout
      android:id="@+id/coupon_popup"
      android:layout_width="320dp"
      android:layout_height="200dp"
      android:layout_margin="20dp"
      android:gravity="center_vertical"
      android:background="@drawable/bg_border_stroke">

写一个 bg_border_stroke的xml做背景。

bg_border_stroke.xml

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >

  <item>
    <shape>
      <stroke
          android:width="1dp"
          android:color="#E8A227" />

      <solid android:color="#FFFFFF" />

      <corners android:radius="5dp" />
    </shape>
  </item>
  <item
      android:bottom="1dp"
      android:left="1dp"
      android:right="1dp"
      android:top="1dp">
    <shape>
      <stroke
          android:dashGap="15dp"
          android:dashWidth="15dp"
          android:width="2.5dp"
          android:color="#E8A227" />

      <solid android:color="#FFFFFF" />

      <corners android:radius="5dp" />
    </shape>
  </item>

</layer-list>

总结

以上就是这篇文章的全部内容了,希望本文的内容对各位Android开发者能有一定的帮助,如果有疑问大家可以留言交流。

Android实现渐变色的圆弧虚线效果

Android实现渐变色的圆弧虚线效果

首先来看看效果图:


1,SweepGradient(梯度渲染)

public SweepGradient (float cx,float cy,int[] colors,float[] positions)

扫描渲染,就是以某个点位中心旋转一周所形成的效果!参数依次是:

      cx:扫描的中心x坐标

      cy:扫描的中心y坐标

      colors:梯度渐变的颜色数组

      positions:指定颜色数组的相对位置

public static final int[] SWEEP_GRADIENT_COLORS = new int[]{Color.GREEN,Color.GREEN,Color.BLUE,Color.RED,Color.RED};
mColorShader = new SweepGradient(radius,radius,SWEEP_GRADIENT_COLORS,null);

效果图:


SweepGradient

2,DashPathEffect(Path的线段虚线化)

DashPathEffect(float[] intervals,float phase)

      intervals:为虚线的ON和OFF的数组,数组中元素数目需要 >= 2

      phase:为绘制时的偏移量

//计算路径的长度
PathMeasure pathMeasure = new PathMeasure(mPath,false);
float length = pathMeasure.getLength();
float step = length / 60;
dashPathEffect = new DashPathEffect(new float[]{step / 3,step * 2 / 3},0);

效果图:


DashPathEffect

3,下面是全部的代码:

package com.example.yyw.xfermodedemo;

import android.animation.ValueAnimator;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.DashPathEffect;
import android.graphics.Paint;
import android.graphics.Path;
import android.graphics.PathMeasure;
import android.graphics.RectF;
import android.graphics.SweepGradient;
import android.util.AttributeSet;
import android.view.View;

/**
 * Created by yyw on 2016/10/11.
 */

public class OilTableLine extends View {
 public static final int[] SWEEP_GRADIENT_COLORS = new int[]{Color.GREEN,Color.RED};
 private int tableWidth = 50;
 private Paint mPaint;
 private Path mPath;
 private RectF mTableRectF;
 //把路径分成虚线段的
 private DashPathEffect dashPathEffect;
 //给路径上色
 private SweepGradient mColorShader;
 //指针的路径
 private Path mPointerPath;
 private float mCurrentDegree = 60;

 public OilTableLine(Context context,AttributeSet attrs) {
  super(context,attrs);
  mPaint = new Paint();
  mPaint.setAntiAlias(true);
  mPaint.setDither(true);
  mPaint.setColor(Color.BLACK);
  mPath = new Path();
  mPointerPath = new Path();
  startAnimator();

 }

 @Override
 protected void onSizeChanged(int w,int h,int oldw,int oldh) {
  super.onSizeChanged(w,h,oldw,oldh);
  float size = Math.min(w,h) - tableWidth * 2;
  //油表的位置方框
  mTableRectF = new RectF(0,size,size);
  mPath.reset();
  //在油表路径中增加一个从起始弧度
  mPath.addArc(mTableRectF,60,240);
  //计算路径的长度
  PathMeasure pathMeasure = new PathMeasure(mPath,false);
  float length = pathMeasure.getLength();
  float step = length / 60;
  dashPathEffect = new DashPathEffect(new float[]{step / 3,0);

  float radius = size / 2;
  mColorShader = new SweepGradient(radius,null);
  //设置指针的路径位置
  mPointerPath.reset();
  mPointerPath.moveto(radius,radius - 20);
  mPointerPath.lineto(radius,radius + 20);
  mPointerPath.lineto(radius * 2 - tableWidth,radius);
  mPointerPath.close();
 }

 @Override
 protected void onDraw(Canvas canvas) {
  super.onDraw(canvas);
  float dx = (getWidth() - mTableRectF.width()) / 2;
  float dy = (getHeight() - mTableRectF.height()) / 2;
  //把油表的方框平移到正中间
  canvas.translate(dx,dy);
  canvas.save();
  //旋转画布
  canvas.rotate(90,mTableRectF.width() / 2,mTableRectF.height() / 2);
  mPaint.setStyle(Paint.Style.stroke);
  mPaint.setstrokeWidth(tableWidth);
  mPaint.setPathEffect(dashPathEffect);
  mPaint.setShader(mColorShader);
  canvas.drawPath(mPath,mPaint);
  canvas.restore();
  //还原画笔
  mPaint.setPathEffect(null);
  mPaint.setShader(null);
  mPaint.setStyle(Paint.Style.FILL);
  mPaint.setstrokeWidth(tableWidth / 10);
  canvas.save();
  canvas.rotate(150 + mCurrentDegree,mTableRectF.height() / 2);
  canvas.drawPath(mPointerPath,mPaint);
  canvas.restore();
 }

 public void startAnimator() {
  ValueAnimator animator = ValueAnimator.ofFloat(0,240);
  animator.setDuration(40000);
  animator.setRepeatCount(ValueAnimator.INFINITE);
  animator.setRepeatMode(ValueAnimator.RESTART);
  animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
   @Override
   public void onAnimationUpdate(ValueAnimator animation) {
    mCurrentDegree = (int) (0 + (Float) animation.getAnimatedValue());
    invalidate();
   }
  });
  animator.start();
 }
}

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流。

android绘制虚线

android绘制虚线

有的时候我们需要一种虚线效果,比如图片的边框,愤怒的小鸟的飞翔路径,那么怎么绘制这些虚线呢?方法很多,目前我觉得好的有两种:

一、自己创建模式,一个点一个点的绘制。

二、用Android提供的 DashPathEffect 类来创建模式绘制。

下面我要演示的就是第二种方法,用Android提供给我的API来绘制。

由于是开发项目的一个小块,下面只能给出部分截图:

android <wbr>绘制虚线效果
效果如上面。

下面看一下核心绘图代码:

public void draw(Canvas mcanvas) {
  GameLog.log(Tag, "draw");

  Paint mLinePaint = newPaint();
  mLinePaint.setColor(Color.WHITE);
  mLinePaint.setStyle(Paint.Style.STROKE);

  //绘制模式
  PathEffect effect = new DashPathEffect(new float[] { 1,2, 4, 8}, 1);
  mLinePaint.setAntiAlias(true);
  mLinePaint.setPathEffect(effect);
  mLinePaint.setStrokeWidth(4);

 

  if (GameManager.getState()== GameManager.GameStart) {
   GameLog.log(Tag,"GameStart");
   float[]oldPts = getPts(mOldPoints);
   mCanvas.drawLines(oldPts,mLinePaint);
   prepareLinesData();
   float[]newPts = getPts(mNewPoints);
   mCanvas.drawLines(newPts,mLinePaint);
  }

}
下面是关于这个DashPathEffect 的一些说明,摘录的:

DashPathEffect是PathEffect类的一个子类,可以使paint画出类似虚线的样子,并且可以任意指定虚实的排列方式.

 

代码中的float数组,必须是偶数长度,且>=2,指定了多少长度的实线之后再画多少长度的空白.

如本代码中,绘制长度1的实线,再绘制长度2的空白,再绘制长度4的实线,再绘制长度8的空白,依次重复.1是偏移量,可以不用理会.

 

简单介绍下 PathEffect类:

PathEffect是用来控制绘制轮廓(线条)的方式。

PathEffect对于绘制Path基本图形特别有用,但是它们也可以应用到任何Paint中从而影响线条绘制的方式。

使用PathEffect,可以改变一个形状的边角的外观并且控制轮廓的外表。

Android包含了多个PathEffect,包括:

CornerPathEffect 可以使用圆角来代替尖锐的角从而对基本图形的形状尖锐的边角进行平滑。

DashPathEffect 可以使用DashPathEffect来创建一个虚线的轮廓(短横线/小圆点),而不是使用实线。你还可以指定任意的虚/实线段的重复模式。

DiscretePathEffect 与DashPathEffect相似,但是添加了随机性。当绘制它的时候,需要指定每一段的长度和与原始路径的偏离度。

PathDashPathEffect 这种效果可以定义一个新的形状(路径)并将其用作原始路径的轮廓标记。

下面的效果可以在一个Paint中组合使用多个Path Effect。

SumPathEffect 顺序地在一条路径中添加两种效果,这样每一种效果都可以应用到原始路径中,而且两种结果可以结合起来。

ComposePathEffect 将两种效果组合起来应用,先使用第一种效果,然后在这种效果的基础上应用第二种效果。

对象形状的PathEffect的改变会影响到形状的区域。这就能够保证应用到相同形状的填充效果将会绘制到新的边界中。

本文同步分享在 博客“xiangzhihong8”(CSDN)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

Android自定义View实现绘制虚线的方法详解

Android自定义View实现绘制虚线的方法详解

前言

说实话当第一次看到这个需求的时候,第一反应就是Canvas只有drawLine方法,并没有drawDashLine方法啊!这咋整啊,难道要我自己做个遍历不断的drawLine?不到1秒,我就放弃这个想法了,因为太恶心了。方法肯定是有的,只不过我不知道而已。

绘制方法

最简单的方法是利用ShapeDrawable,比如说你想用虚线要隔开两个控件,就可以在这两个控件中加个View,然后给它个虚线背景。

嗯,理论上就是这样子的,实现上也很简单。

<!-- drawable 文件 -->
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
 android:shape="line">
 <stroke
 android:width="1dp"
 android:color="@color/dash_line"
 android:dashGap="2dp"
 android:dashWidth="3dp"/>
</shape>
<!-- 布局文件 -->
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
 xmlns:android="http://schemas.android.com/apk/res/android"
 xmlns:tools="http://schemas.android.com/tools"
 android:id="@+id/activity_main"
 android:layout_width="match_parent"
 android:layout_height="wrap_content"
 android:orientation="vertical"
 android:gravity="center"
 tools:context="hope.example.dashlinedemo.MainActivity">

 <TextView
 android:layout_width="match_parent"
 android:layout_height="40dp"
 android:gravity="center"
 android:text="分享给微信好友"/>

 <View
 android:layout_width="match_parent"
 android:layout_height="2dp"
 android:background="@drawable/dash_line" />

 <TextView
 android:layout_width="match_parent"
 android:layout_height="40dp"
 android:gravity="center"
 android:text="分享至朋友圈" />
</LinearLayout>

写完之后,从Android Studio的预览功能上就可以看到效果了。


是不是很简单呢?慢着,先别高兴得太早了,真机上跑一下看看效果先。

这什么鬼,明明是虚线才对的啊,Studio上的预览也可以看出代码没问题的。其实,这是因为我们现在的手机默认都是开启了硬件加速的,而dashGap不支持硬件加速,我们只需要修改下View的参数,把硬件加速关了就好了。

<View
 android:layout_width="match_parent"
 android:layout_height="2dp"
 android:background="@drawable/dash_line"
 android:layerType="software"/>

使用ShapeDrawable实现虚线的方式虽然简单,但是简单就意味着不灵活。比如说要求虚线是根据用户操作来判断要不要添加的,这种情况下就不如使用Canvas来实现方便了。

前面说了,Canvas只有drawLine方法,没有drawDashLine方法。但是你要知道,画什么虽然是Canvas决定的,但是怎么画却是由画笔Paint决定的。接下来看看这神奇的画笔怎么帮我们把直线画成虚的吧。

Paint有setPathEffect(PathEffect effect)这么一个方法,PathEffect一共有五个子类:ComposePathEffect,CornerPathEffect,DashPathEffect,discretePathEffect,PathDashPathEffect,SumPathEffect,其中的DashPathEffect就是我们需要的虚线效果,其它的几种效果大家可以自己试一试。

DashPathEffect的创建需要两个参数,一个float数组,代表实线与空白处的长度。比如说我给的参数是new float[] {10,5} ,那么虚线的一个单位就是10像素的实线加上5像素的空白,然后以它为单位去不断重复画,从而形成一条虚线。而如果设定的参数是new float[] {10,5,20,10},那么虚线的一个单位就是由10像素实线,5像素空白,20像素实线,10像素空白组成的虚线段。

另一个参数代表偏移,一般我们设置为0即可,如果要实现虚线的动画效果的话,可以不断改变这个值,从而让虚线动起来。

接着实现这个自定义view,并将它代替上面xml文件中的虚线(View)即可。

public class DashLineView extends View {

 private Paint mPaint;

 public DashLineView(Context context,AttributeSet attrs) {
 super(context,attrs);

 mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
 mPaint.setColor(getResources().getColor(R.color.dash_line));
 mPaint.setstrokeWidth(3);
 mPaint.setPathEffect(new DashPathEffect(new float[] {5,5},0));

 }

 @Override
 protected void onDraw(Canvas canvas) {
 int centerY = getHeight() / 2;
 canvas.drawLine(0,centerY,getWidth(),mPaint);
 }
}

代码跑起来之后又发现虚线变成了直线,根本就没有效果。有了上面使用ShapeDrawable的经验之后,我们完全有理由猜测这是由于硬件加速引起的,到官方文档硬件加速上可以看到确实是因为硬件加速导致的。

(PS:其实真实情况是我先自定义view后才知道ShapeDrawable没有虚线效果可能也是因为硬件加速引起的。)


重新修改onDraw方法。重新运行之后,虚线就正常出现了。

@Override
protected void onDraw(Canvas canvas) {
 int centerY = getHeight() / 2;
 setLayerType(LAYER_TYPE_SOFTWARE,null);
 canvas.drawLine(0,mPaint);
}

使用shapeDrawable和drawLine方法都能实现虚线的效果,但它们的缺点也很明显,就是不支持硬件加速。上面的代码因为简单,所以不会引起卡顿的问题,但是如果你的自定义view很复杂,比如说用户在画矩形框的时候,如果用户拉出来的图形是一个正方形,那我们就画一条对角虚线来提醒用户。这种情况下不支持硬件加速的弊端可能就会显现出来了。好在我们还有其它方法来实现虚线的绘制。setPathEffect方法只是不支持直线而已,那我们就找找有没有另外的方式来画直线,drawPath就可以绘制各种路径,当然也可以帮我们绘制直线,虽然说有点大材小用了。

重新来看看代码怎么写。

public class DashLineView extends View {

 private Paint mPaint;
 private Path mPath;

 public DashLineView(Context context,attrs);

 mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
 mPaint.setColor(getResources().getColor(R.color.dash_line));
 // 需要加上这句,否则画不出东西
 mPaint.setStyle(Paint.Style.stroke);
 mPaint.setstrokeWidth(3);
 mPaint.setPathEffect(new DashPathEffect(new float[] {15,0));

 mPath = new Path();
 }

 @Override
 protected void onDraw(Canvas canvas) {
 int centerY = getHeight() / 2;
 mPath.reset();
 mPath.moveto(0,centerY);
 mPath.lineto(getWidth(),centerY);
 canvas.drawPath(mPath,mPaint);
 }
}

setLayerType(LAYER_TYPE_SOFTWARE,null);这一句代码去掉之后也还能画出虚线,证明是支持硬件加速的。

至此,我们已经完美的实现了虚线的绘制,但本篇文章还没完呢!我们绘制出来的虚线是一个实心矩形,那如果我们要求这条是由实心圆形组成的呢?又或者是其它图形组成的呢?这时候我们就可以用PathDashPathEffect来实现了,看清楚点,是PathDashPathEffect而不是DashPathEffect!PathDashPathEffect允许我们添加一个路径来定义虚线的样式。我们把setPathEffect()改一下,看看效果。

Path path = new Path();
path.addCircle(0,3,Path.Direction.CW);
mPaint.setPathEffect(new PathDashPathEffect(path,15,PathDashPathEffect.Style.ROTATE));

其实圆形组成的虚线也挺好看的嘛。绘制虚线至此就讲完了,但如果要我们给这条虚线加一些效果呢?比如说虚线由中间是完全不透明的,而两边则会慢慢变透明。是不是想打人了,又不是不能用,那么多要求干嘛!没办法,硬着头皮来吧。Paint还有另外一个方法,setShader(Shader shader) ,Shader我们可以理解为着色器,它有一个子类是LinearGradient,利用它可以帮助我们实现线性变色。看看代码先。

为了让效果突出一点,把虚线的颜色调为黑色。

// 其它方法还是不变
@Override
protected void onSizeChanged(int w,int h,int oldw,int oldh) {
 super.onSizeChanged(w,h,oldw,oldh);

 // 前四个参数没啥好讲的,就是起点和终点而已。
 // color数组的意思是从透明 -> 黑 -> 黑 -> 透明。
 // float数组与color数组对应:
 // 0 -> 0.3 (透明 -> 黑)
 // 0.3 - 0.7 (黑 -> 黑,即不变色)
 // 0.7 -> 1 (黑 -> 透明)
 mPaint.setShader(new LinearGradient(0,new int[] {Color.TRANSPARENT,Color.BLACK,Color.TRANSPARENT},new float[] {0,0.3f,0.7f,1f},Shader.TileMode.CLAMP));
}

效果还是可以的嘛,当然不是应用在图片上的这种场景。好了,这次是真的讲完了。虽然画虚线不难,但还是有一些值得注意的地方的(硬件加速),然后再细细玩一玩,虽然简单,还是可以玩出一些花样来的。

总结

以上就是这篇文章的全部内容了,希望本文的内容对各位Android开发者们能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对编程小技巧的支持。

今天关于ichart.js绘制虚线、平均分虚线效果的实现代码js画虚线的介绍到此结束,谢谢您的阅读,有关Android实现代码画虚线边框背景效果、Android实现渐变色的圆弧虚线效果、android绘制虚线、Android自定义View实现绘制虚线的方法详解等更多相关知识的信息可以在本站进行查询。

本文标签:

上一篇JS平滑无缝滚动效果的实现代码(js平滑无缝滚动效果的实现代码是什么)

下一篇Sea.JS知识总结(sea. js)