重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
android开发中虚线的用法:
创新互联服务项目包括榆社网站建设、榆社网站制作、榆社网页制作以及榆社网络营销策划等。多年来,我们专注于互联网行业,利用自身积累的技术优势、行业经验、深度合作伙伴关系等,向广大中小型企业、政府机构等提供互联网行业的解决方案,榆社网站推广取得了明显的社会效益与经济效益。目前,我们服务的客户以成都为中心已经辐射到榆社省份的部分城市,未来相信会继续扩大服务区域并继续获得客户的支持与信任!
一、自己创建模式,一个点一个点的绘制。
二、用Android提供的 DashPathEffect 类来创建模式绘制。
下面我要演示的就是第二种方法,用Android提供给我的API来绘制。
由于是开发项目的一个小块,下面只能给出部分截图:
下面看一下核心绘图代码:
public void draw(Canvas mcanvas) {
GameLog.log(Tag, "draw");
Paint mLinePaint = new Paint();
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);
}
}
简单介绍下 PathEffect类:
PathEffect是用来控制绘制轮廓(线条)的方式。
PathEffect对于绘制Path基本图形特别有用,但是它们也可以应用到任何Paint中从而影响线条绘制的方式。
使用PathEffect,可以改变一个形状的边角的外观并且控制轮廓的外表。
Android包含了多个PathEffect,包括:
CornerPathEffect 可以使用圆角来代替尖锐的角从而对基本图形的形状尖锐的边角进行平滑。
DashPathEffect 可以使用DashPathEffect来创建一个虚线的轮廓(短横线/小圆点),而不是使用实线。你还可以指定任意的虚/实线段的重复模式。
DiscretePathEffect 与DashPathEffect相似,但是添加了随机性。当绘制它的时候,需要指定每一段的长度和与原始路径的偏离度。
PathDashPathEffect 这种效果可以定义一个新的形状(路径)并将其用作原始路径的轮廓标记。
下面的效果可以在一个Paint中组合使用多个Path Effect。
SumPathEffect 顺序地在一条路径中添加两种效果,这样每一种效果都可以应用到原始路径中,而且两种结果可以结合起来。
ComposePathEffect 将两种效果组合起来应用,先使用第一种效果,然后在这种效果的基础上应用第二种效果。
对象形状的PathEffect的改变会影响到形状的区域。这就能够保证应用到相同形状的填充效果将会绘制到新的边界中。
方式:
###第一种是通过写shape布局文件来实现给TextView设置background时引用此布局文件即可实现效果,shape布局文件代码如下:
stroke标签下为虚线框的主要设置,dashGap表示中间隔开一段距离,即定义了样式为虚线,效果图如下:
###第二种方式是通过自定义View使之继承View,然后在onDraw方法中将虚线和文字用Paint画笔画出。
主要代码如下:
public class DashedSurroundTextView extends View {
/
mTextColor 文字颜色 mBorderColor 虚线边界颜色 mBorderWidth虚线边界宽度
mTextSizen 文字大小 mText 文字内容
/
private int mTextColor;
private int mBorderColor;
private float mBorderWidth;
private float mTextSize;
private String mText;
private float start_x = 0;
private float start_y = 0;
private float padding = 5;
private float baseLineLong = 10;
private float radiusX = 20;
private float radiusY = 20;
...
public DashedSurroundTextView(Context context, AttributeSet attrs) {
super(context, attrs);
//获取自定义参数
TypedArray typedArray = context.obtainStyledAttributes(attrs,
R.styleable.DashedSurroundTextView);
//虚线border颜色
mBorderColor = typedArray.getColor(R.styleable.DashedSurroundTextView_border_color, Color.argb(0, 0, 0, 0));
//虚线border宽度
mBorderWidth = typedArray.getDimension(R.styleable.DashedSurroundTextView_border_width, 0);
//字体颜色
mTextColor = typedArray.getColor(R.styleable.DashedSurroundTextView_textColor, Color.argb(0, 0, 0, 0));
//字体大小
mTextSize = typedArray.getDimension(R.styleable.DashedSurroundTextView_textSize, 0);
//显示文字
mText = typedArray.getString(R.styleable.DashedSurroundTextView_text);
}
楼主,你的这个问题我遇到过,并且用另一种方式解决了。
首先告诉你,listview的分割线不能设置为虚线,你也知道关于它的两个属性:
android:divider="#FFCC00"(或者android:divider="@color/divider_color")
android:dividerHeight="4px"
一个是设置颜色,一个是设置高度。没法设置为虚线。
---------------------------
我的做法是这样的!比较暴力,但能解决问题。
让美工给你做一个虚线的图!保存为 xuxian.png
然后再用android:divider="@drawable/xuxian",把它设置为这个图。看上去就是个虚线了。至于效果,让美工和你一起再慢慢细调。
结论是:很绝望。目前只有这一个办法,可以解决你的问题。
手动打字,非ctrl+c / ctrl+v之流。但愿能帮到你
使用paint来画。
Paint paint = new Paint ( ) ;
paint.setColor ( Color.BLACK ) ;
//设置画直线格式
paint.setStyle ( Paint.Style.STROKE ) ;
//设置虚线效果
paint.setPathEffect ( new DashPathEffect ( new float [ ] { 3, 2 }, 0 ) ) ;
最后这句是设置虚线效果,里边的float数组的意思是:先画长度为3的实线,再间隔长度为2的空白,之后一直重复这个单元。这个数组的长度只要大于等于2就行,你可以设置多个数值,产生不同效果,最后这个0指的是与起始位置的偏移量。
在OpenGL中画线是可以完全的控制,比如画虚线,用函数glLineStipple就可以控制画线的模式:
函数glLineStipple有两个参数,第一个是重复的次数,第二个是用一个16-bit的数来控制,0表示不画,1表示画;比如0000111100001111=0x0F0F表示“ — —”这个模式。
glLineWidth (1.0);
glLineStipple (1, 0x0F0F);
glBegin(GL_LINES);
glVertex2f (0.0,0.0); glVertex2f (100.0,100.0);
glEnd();
画出来的就是虚线。
动态绘制虚线,可以参考如下内容:
、被称为点画的影响。不幸的是,点画已经从OpenGL的删除,但幸运的是,有几种方法仍然得到的效果。我们必须充分利用的OpenGL的着色语言的这项任务。 顶点着色器:uniform mat4 u_modelViewProjectionMatrix;
uniform mat4 mv;
attribute vec4 a_position;
attribute vec4 a_color;
varying vec4 v_color;
varying vec4 position;
void main() {
gl_Position = u_modelViewProjectionMatrix * a_position;
position = mv * a_position;
v_color = a_color;
}
着色器:precision mediump float;
uniform vec2 sourcePoint;
varying vec4 v_color;
varying vec4 position;
void main() {
if (cos(0.1*abs(distance(sourcePoint.xy, position.xy))) + 0.5 0.0) {
gl_FragColor = vec4(0,0,0,0);
} else {
gl_FragColor = v_color;
}
}
我没有在这里找到本教程中,我测试了,这里是我的结果:
正如罗斯托夫在这个线程解释,这里最大的部分是sourcePoint。
的关键 CodeGo.net,整个事情是sourcePoint被传递的
该行的起源。
如果你不喜欢这种方式也存在textures图案的效果。有与α虚线效果textures,并将其应用到您的线路。
2.
我找到了一个更好的解决方案。它的水平和垂直线。
#define DOT_VERTEX_CODE \
"attribute vec4 a_Position;" \
"uniform mat4 projectionMatrix;" \
"varying vec2 v_xy;" \
"void main() {gl_PointSize = 1.0; gl_Position = a_Position*projectionMatrix; v_xy = a_Position.xy;}"
#define DOT_FRAGMENT_CODE \
"precision mediump float;" \
"varying vec2 v_xy;" \
"uniform float isVert;" \
"uniform vec4 color1;" \
"uniform vec4 color2;" \
"void main() {gl_FragColor = mod(isVert 0.0 ? v_xy.y : v_xy.x, 2.0) = 1.0 ? color1 : color2;}"