前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Android绘图Canvas十八般武器之Shader详解及实战篇(上)

Android绘图Canvas十八般武器之Shader详解及实战篇(上)

作者头像
Frank909
发布于 2019-01-14 10:07:06
发布于 2019-01-14 10:07:06
3.3K00
代码可运行
举报
文章被收录于专栏:Frank909Frank909
运行总次数:0
代码可运行

本篇文章已授权微信公众号 guolin_blog (郭霖)独家发布

前言

Android中绘图离不开的就是Canvas了,Canvas是一个庞大的知识体系,有java层的,也有jni层深入到Framework。Canvas有许多的知识内容,构建了一个武器库一般,所谓十八般武艺是也,PaintCanvas的一个重要的合作伙伴,但今天要讲的不是Canvas也不是Paint,而是与Paint相关的知识点Shader.

什么是Shader?

Shader在英语辞典中被解释为着色器。查阅维基百科,有以下结论:

In the field of computer graphics, a shader is a computer program that is used to do shading: the production of appropriate levels of color within an image, or, in the modern era, also to produce special effects or do video post-processing. A definition in layperson’s terms might be given as “a program that tells a computer how to draw something in a specific and unique way. 在计算机图形领域,一个Shader是指一段用来着色的计算机程序,通常用来生成一张图片中适当等级的颜色值,或者是生成特殊的视觉效果,或者是对视频画面进行处理。对于非专业人士的角度来看,它可以被描述为–“一种告诉计算机怎么样通过某种特殊手段绘制一些图像的程序”。

看起来还是比较抽象难懂,但是我觉得正确理解它的定义是应该的,这能让我们真正写出非常高效的代码。

Android中也有Shader的概念,对照上面的定义,它应该也是将图形画面产生某种特殊效果的一类东西。具体是不是这样的呢?我可以先告诉你答案–是的。 为了提高大家对Shader的兴趣,先让大家看看通过Shader得到的一些效果图片。

是不是挺有趣啊?如果你对这些感兴趣,请跟随我的节奏,看下面内容。

Android中Shader相关知识点

API终于不要访问外国网站了,其实我也一直没有访问外国网站,想看API的时候,直接去www.androidxref.com查看源码去了。那么现在可以直接上官网中文页面,查看了。Android中Shader的API地址为Shader

Android中对Shader是这样解释的

Shader是一种基类对象,它在图形绘制过程中返回一段段颜色值,通过调用Paint.setShader()方法,可以将它的子类安装进画笔,这样Paint对象在绘制过程中所获取的颜色就是来自Shader对象。

上面提到了Shader的子类,Shader有5个子类 BitmapShader, ComposeShader, LinearGradient, RadialGradient, SweepGradient。 本文的目的也是分别讲它的各个子类。

图片渲染器 BitmapShader

BitmapShader将一张图片当作纹理(在OpenGL中,纹理就是贴图的意思,可以理解为一个没有颜色的正文形被贴上了一张图片,这样视觉效果就是一张正方形的图片)来绘制。而这张图片可以通过设置BitmapShader的tiling mode来达到镜面和重复的效果。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
BitmapShader (Bitmap bitmap, 
                Shader.TileMode tileX, 
                Shader.TileMode tileY)

上面是BitmapShader的构造方法。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
bitmap是指纹理图片,
tileX是指在X方向轴的tiling mode
tileY是指在Y方向轴的tiling mode

很多人可能有疑问,这个TileMode是什么?

神秘莫测的TileMode

什么是TileMode呢? 事实上它只是一个枚举而已。它只有三个值。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Shader.TileMode CLAMP
Shader.TileMode MIRROR
Shader.TileMode REPEAT

CLAMP

它的意思当要绘制的区间大于图片纹理本身的区间时,多出来的空间位置将被纹理图片的边缘颜色填充。文字很难解释,我用图片来代替吧。 原图如下:

原图的分辨率是562*336

我们编写一个自定义View–CustomView。然后在它的onDraw()方法中画一个矩形,并且设置画笔的Shader为BitmapShader,Shader的tiling模式为CLAMP. 代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Override
protected void onDraw(Canvas canvas) {
    super.onDraw(canvas);
    int w = getWidth();
    int h = getHeight();

    Bitmap bmp = BitmapFactory.decodeResource(getResources(),R.drawable.yourname);
    mShader = new BitmapShader(bmp, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP);
    mPaint.setShader(mShader);
    canvas.drawRect(0,0,w,h,mPaint);
 }

大家现在只需要关注mShader = new BitmapShader(bmp, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP);这行代码就可以了,剩下的呆会讲。

在MainActivity中的布局文件中,我们加入这个自定义View。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 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="match_parent"
    tools:context="com.frank.gradientdemo.MainActivity">

    <com.frank.gradientdemo.CustomView
        android:layout_width="match_parent"
        android:layout_height="400dp" />
</RelativeLayout>

我们可以看到CustomView的宽占手机整个屏幕,高是400dp. 我们在代码中以CustomView的宽高画一个矩形,并以上面的图片作为贴图纹理,效果如下:

效果图:

好像和原图有点不一样? 红框外面的是什么?我们把手机弄成横屏再看

这次双不一样了!红框右边也和下边一个德行了 让我们把注意力回到CLAMP的定义。

它的意思当要绘制的区间大于图片纹理本身的区间时,多出来的空间位置将被纹理图片的边缘颜色填充。

结合例子看,这下应该能明白它的含义了吧。上面的例子中,如果贴图的纹理本身小于要绘制的区域,那么超出部分将会以边缘的颜色填充。所以就造成了上面的现象。大家可以细细体会一下。我们看下一个知识点。

MIRROR

这个模式能够让纹理以镜像的方式在X和Y方向复制。

这个模式很容易理解大家看图。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Override
protected void onDraw(Canvas canvas) {
    super.onDraw(canvas);
    int w = getWidth();
    int h = getHeight();

    Bitmap bmp = BitmapFactory.decodeResource(getResources(),R.drawable.yourname);
    mShader = new BitmapShader(bmp, Shader.TileMode.MIRROR, Shader.TileMode.MIRROR);
    mPaint.setShader(mShader);
    canvas.drawRect(0,0,w,h,mPaint);
}

这就是镜像的效果。

REPEAT

它的作用是将图片纹理沿XY轴进行复制。什么意思?看图就懂,在这里,我要换一张图片,作为演示效果。

然后代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Override
protected void onDraw(Canvas canvas) {
    super.onDraw(canvas);
    int w = getWidth();
    int h = getHeight();

    Bitmap bmp = BitmapFactory.decodeResource(getResources(),R.drawable.repeat);
    mShader = new BitmapShader(bmp, Shader.TileMode.REPEAT, Shader.TileMode.REPEAT);
    mPaint.setShader(mShader);
    canvas.drawRect(0,0,w,h,mPaint);
}

效果:

哇噻!!!好多小狗狗。

大家有没有觉得Repeat模式特别有用呢?一张图就铺满整个空间。

混合双打

上面讲过的内容都是针对XY方向为同一种模式。能不能混合使用呢?

X—->CLAMP Y—->MIRROR

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
mShader = new BitmapShader(bmp, Shader.TileMode.CLAMP, Shader.TileMode.MIRROR);

狗狗看起来更忧伤了。

X—->MIRROR Y—->CLAMP

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
mShader = new BitmapShader(bmp, Shader.TileMode.MIRROR, Shader.TileMode.CLAMP);

有点恐怖是不是?

X—->CLAMP Y—->REPEAT

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
mShader = new BitmapShader(bmp, Shader.TileMode.CLAMP, Shader.TileMode.REPEAT);

可以看到右边的部分拉伸了,然后上下复制同样的图像。

X—->REPEAT Y—->CLAMP

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
mShader = new BitmapShader(bmp, Shader.TileMode.REPEAT, Shader.TileMode.CLAMP);

可以看到右边进行了复制,下面进行了拉伸。

X—->REPEAT Y—->MIRROR

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
mShader = new BitmapShader(bmp, Shader.TileMode.REPEAT, Shader.TileMode.MIRROR);

右边的复制,下面的是镜像。

X—->MIRROR Y—->REPEAT

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
mShader = new BitmapShader(bmp, Shader.TileMode.MIRROR, Shader.TileMode.REPEAT);

右边的是镜像,下面的是上面图像的复制。

好了,TILEMODE讲完了,我们进入主题(感觉怪怪的,这篇文章不是讲TILEMODE的吗?)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
BitmapShader (Bitmap bitmap, 
                Shader.TileMode tileX, 
                Shader.TileMode tileY)

我们再来回顾下它的构造方法,bitmap是纹理图片,两个TileMode的参数对象我们也已经知道了含义与用法。现在我们来了解一下它的用法。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Override
protected void onDraw(Canvas canvas) {
    super.onDraw(canvas);
    int w = getWidth();
    int h = getHeight();

    int radius = w <= h ? w/2 : h/2;


    //1 解析bitmap对象
    Bitmap bmp = BitmapFactory.decodeResource(getResources(),R.drawable.repeat);

    //2 以bitmap对象生成BitmapShader,并且设置它的X和Y轴方向上的TILEMODE
    mShader = new BitmapShader(bmp, Shader.TileMode.REPEAT, Shader.TileMode.REPEAT);

    //3 将BitmapShader对象安装到画笔对象上
    mPaint.setShader(mShader);

    //4 以该画笔绘制图形
    canvas.drawCircle(w/2,h/2,radius,mPaint);  

}

上面的代码是绘制一个圆形,然后用图片重复铺图。效果如下:

是不是很有感觉? 像自定义圆形图片控件效果一样。这小狗忧伤的让我想想起了张嘉佳的《从你的全世界路过》的梅茜和刘大黑。

我们再发散思维下圆形图像控件代码编写? 相信大家都知道,用可以设置先用canvas绘制一张图片,然后设置画笔的Xfermode Paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN)); 然后再绘制一个圆。

现在我们尝试用BitmapShader的方式去编写这么一个功能。 思路: 1. 首先我们要确保这个自定义View是正方形的。 2. 我们以目标图片创建一个BitmapShader,然后设置进画笔。 3. 我们用设置好的画笔利用Canvas绘制一个圆形。 4. 关键一点,我们需要对原始的bitmap进行尺寸的调整,使得它的宽高至少要等于圆形的半径。

好了,编写代码.

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class CustomView extends View {
    private Paint mPaint;

    private Shader mShader;

    public CustomView(Context context) {
        this(context,null);
    }

    public CustomView(Context context, AttributeSet attrs) {
        this(context, attrs,0);
    }

    public CustomView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);

        mPaint = new Paint();
        mPaint.setAntiAlias(true);

    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
        //这里为了方便演示,将尺寸固定为400*400
        setMeasuredDimension(400,400);
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        int w = getWidth();
        int h = getHeight();

        int radius = w <= h ? w/2 : h/2;
        //原图
        Bitmap bmp = BitmapFactory.decodeResource(getResources(),R.drawable.repeat);
        //以目标宽高创建一个缩放过的图片
        Bitmap result = Bitmap.createScaledBitmap(bmp,w,h,false);
        //用位图创建BitmapShader
        mShader = new BitmapShader(result, Shader.TileMode.REPEAT, Shader.TileMode.REPEAT);
        mPaint.setShader(mShader);
        //画圆
        canvas.drawCircle(w/2,h/2,radius,mPaint);
    }

}

效果图:

优伤的小狗又出来了。

更牛X的功能。

我们已经知道怎么样通过BitmapShader去渲染一个矩形或者是圆形了,但它的神奇之处就在于此吗???

当然不是!!! Shader被称为着色器,它用来渲染物体。在OPENGL 3d世界中,纹理可以看作是光秃秃的模型的皮肤,它可以为正文体,圆球,甚至复杂的人像模型着色。而在Canvas的范畴内,Shader肯定只是为了2d平面着色,除了矩形,圆形,它肯定还适用于三角形和其它多边形以及任何闭合的不规则图形,如何的图形称为不规则图形呢?

我想说文字算不算??? 看图说话:

小狗狗的图像粘贴到文字上了。代码却十分的简单。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Bitmap bmp = BitmapFactory.decodeResource(getResources(),R.drawable.repeat);
mShader = new BitmapShader(bmp, Shader.TileMode.REPEAT, Shader.TileMode.REPEAT);
mPaint.setTextSize(200.0f);
mPaint.setColor(Color.RED);
mPaint.setTypeface(Typeface.DEFAULT_BOLD);
mPaint.setShader(mShader);
canvas.drawText("小狗狗",0,h/2,mPaint);

好了,讲完了,意犹未尽的感觉。

本来还打算讲ComposeShader, LinearGradient, RadialGradient, SweepGradient的,由于篇幅原因,分开讲好了。下一篇讲其它的Shader子类。

Android绘图Canvas十八般武器之Shader详解及实战篇(下)

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2016年12月15日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
Install Jumpserver42
Copying '/opt/jumpserver/apps/static/js/plugins/inputTags.jquery.min.js' Copying '/opt/jumpserver/apps/static/js/plugins/cropper/cropper.min.js' Copying '/opt/jumpserver/apps/static/js/plugins/datatables/datatables.min.js' Copying '/opt/jumpserver/apps/static/js/plugins/datatables/pdfmake.min.js.map' Copying '/opt/jumpserver/apps/static/js/plugins/datatables/i18n/English.lang' Copying '/opt/jumpserver/apps/static/js/plugins/datatables/i18n/zh-hans.json' Copying '/opt/jumpserver/apps/static/js/plugins/datepicker/bootstrap-datepicker.js' Copying '/opt/jumpserver/apps/static/js/plugins/demo/peity-demo.js' Copying '/opt/jumpserver/apps/static/js/plugins/dropzone/dropzone.js' Copying '/opt/jumpserver/apps/static/js/plugins/echarts/echarts-all.js' Copying '/opt/jumpserver/apps/static/js/plugins/echarts/echarts.js' Copying '/opt/jumpserver/apps/static/js/plugins/echarts/chart/bar.js' Copying '/opt/jumpserver/apps/static/js/plugins/echarts/chart/chord.js' Copying '/opt/jumpserver/apps/static/js/plugins/echarts/chart/eventRiver.js' Copying '/opt/jumpserver/apps/static/js/plugins/echarts/chart/force.js' Copying '/opt/jumpserver/apps/static/js/plugins/echarts/chart/funnel.js' Copying '/opt/jumpserver/apps/static/js/plugins/echarts/chart/gauge.js' Copying '/opt/jumpserver/apps/static/js/plugins/echarts/chart/heatmap.js' Copying '/opt/jumpserver/apps/static/js/plugins/echarts/chart/k.js' Copying '/opt/jumpserver/apps/static/js/plugins/echarts/chart/line.js' Copying '/opt/jumpserver/apps/static/js/plugins/echarts/chart/map.js' Copying '/opt/jumpserver/apps/static/js/plugins/echarts/chart/pie.js' Copying '/opt/jumpserver/apps/static/js/plugins/echarts/chart/radar.js' Copying '/opt/jumpserver/apps/static/js/plugins/echarts/chart/scatter.js' Copying '/opt/jumpserver/apps/static/js/plugins/echarts/chart/tree.js' Copying '/opt/jumpserver/apps/static/js/plugins/echarts/chart/treemap.js' Copying '/opt/jumpserver/apps/static/js/plugins/echarts/chart/venn.js' Copying '/opt/jumpserver/apps/static/js/plugins/echarts/chart/wordCloud.js' C
franket
2022/07/11
4190
Install Jumpserver43
Copying '/opt/jumpserver/apps/static/js/plugins/highcharts/modules/heatmap.js' Copying '/opt/jumpserver/apps/static/js/plugins/highcharts/modules/heatmap.src.js' Copying '/opt/jumpserver/apps/static/js/plugins/highcharts/modules/no-data-to-display.js' Copying '/opt/jumpserver/apps/static/js/plugins/highcharts/modules/no-data-to-display.src.js' Copying '/opt/jumpserver/apps/static/js/plugins/highcharts/modules/solid-gauge.js' Copying '/opt/jumpserver/apps/static/js/plugins/highcharts/modules/solid-gauge.src.js' Copying '/opt/jumpserver/apps/static/js/plugins/highcharts/themes/dark-blue.js' Copying '/opt/jumpserver/apps/static/js/plugins/highcharts/themes/dark-green.js' Copying '/opt/jumpserver/apps/static/js/plugins/highcharts/themes/dark-unica.js' Copying '/opt/jumpserver/apps/static/js/plugins/highcharts/themes/gray.js' Copying '/opt/jumpserver/apps/static/js/plugins/highcharts/themes/grid-light.js' Copying '/opt/jumpserver/apps/static/js/plugins/highcharts/themes/grid.js' Copying '/opt/jumpserver/apps/static/js/plugins/highcharts/themes/sand-signika.js' Copying '/opt/jumpserver/apps/static/js/plugins/highcharts/themes/skies.js' Copying '/opt/jumpserver/apps/static/js/plugins/iCheck/icheck.min.js' Copying '/opt/jumpserver/apps/static/js/plugins/jstree/jstree.min.js' Copying '/opt/jumpserver/apps/static/js/plugins/layer/layer.js' Copying '/opt/jumpserver/apps/static/js/plugins/layer/skin/layer.css' Copying '/opt/jumpserver/apps/static/js/plugins/layer/skin/default/icon-ext.png' Copying '/opt/jumpserver/apps/static/js/plugins/layer/skin/default/icon.png' Copying '/opt/jumpserver/apps/static/js/plugins/layer/skin/default/loading-0.gif' Copying '/opt/jumpserver/apps/static/js/plugins/layer/skin/default/loading-1.gif' Copying '/opt/jumpserver/apps/static/js/plugins/layer/skin/default/loading-2.gif' Copying '/opt/jumpserver/apps/static/js/plugins/magnific/jquery.magnific-popup.min.js' Copying '/opt/jumpserver/apps/static/js/plugins/metisMenu/jquery.metisMenu.js' Copying '/opt/jumpserver/apps/static/js/plugins/pace/pac
franket
2022/07/11
3360
Install Jumpserver38
运行 Jumpserver(py3) [root@h165 utils]# cd /opt/jumpserver(py3) [root@h165 jumpserver]# ./jms start allSun Jul 22 17:52:27 2018Jumpserver version 1.3.3, more see https://www.jumpserver.org- Start Gunicorn WSGI HTTP ServerCheck database structure change ...20
franket
2022/07/11
2950
Install Jumpserver41
Copying '/opt/jumpserver/apps/static/fonts/FontAwesome.otf' Copying '/opt/jumpserver/apps/static/fonts/fontawesome-webfont.eot' Copying '/opt/jumpserver/apps/static/fonts/fontawesome-webfont.svg' Copying '/opt/jumpserver/apps/static/fonts/fontawesome-webfont.ttf' Copying '/opt/jumpserver/apps/static/fonts/fontawesome-webfont.woff' Copying '/opt/jumpserver/apps/static/fonts/fontawesome-webfont.woff2' Copying '/opt/jumpserver/apps/static/fonts/glyphicons-halflings-regular.eot' Copying '/opt/jumpserver/apps/static/fonts/glyphicons-halflings-regular.svg' Copying '/opt/jumpserver/apps/static/fonts/glyphicons-halflings-regular.ttf' Copying '/opt/jumpserver/apps/static/fonts/glyphicons-halflings-regular.woff' Copying '/opt/jumpserver/apps/static/fonts/glyphicons-halflings-regular.woff2' Copying '/opt/jumpserver/apps/static/fonts/font_otp/iconfont.css' Copying '/opt/jumpserver/apps/static/fonts/font_otp/iconfont.eot' Copying '/opt/jumpserver/apps/static/fonts/font_otp/iconfont.js' Copying '/opt/jumpserver/apps/static/fonts/font_otp/iconfont.svg' Copying '/opt/jumpserver/apps/static/fonts/font_otp/iconfont.ttf' Copying '/opt/jumpserver/apps/static/fonts/font_otp/iconfont.woff' Copying '/opt/jumpserver/apps/static/img/authenticator_android.png' Copying '/opt/jumpserver/apps/static/img/authenticator_iphone.png' Copying '/opt/jumpserver/apps/static/img/facio.ico' Copying '/opt/jumpserver/apps/static/img/logo-text.png' Copying '/opt/jumpserver/apps/static/img/logo.png' Copying '/opt/jumpserver/apps/static/img/otp_auth.png' Copying '/opt/jumpserver/apps/static/img/root.png' Copying '/opt/jumpserver/apps/static/img/avatar/admin.png' Copying '/opt/jumpserver/apps/static/img/avatar/user.png' Copying '/opt/jumpserver/apps/static/js/angular-route.min.js' Copying '/opt/jumpserver/apps/static/js/angular.min.js' Copying '/opt/jumpserver/apps/static/js/bootstrap-dialog.js' Copying '/opt/jumpserver/apps/static/js/bootstrap.min.js' Copying '/opt/jumpserver/apps/static/js/inspinia.js' Copying '/opt/jumpserver/apps/static/js/jquery-2.1.1.j
franket
2022/07/11
3620
Install Jumpserver44
Copying '/opt/py3/lib/python3.6/site-packages/rest_framework/static/rest_framework/docs/css/font-awesome-4.0.3.css' Copying '/opt/py3/lib/python3.6/site-packages/rest_framework/static/rest_framework/docs/css/highlight.css' Copying '/opt/py3/lib/python3.6/site-packages/rest_framework/static/rest_framework/docs/css/jquery.json-view.min.css' Copying '/opt/py3/lib/python3.6/site-packages/rest_framework/static/rest_framework/docs/fonts/fontawesome-webfont.eot' Copying '/opt/py3/lib/python3.6/site-packages/rest_framework/static/rest_framework/docs/fonts/fontawesome-webfont.svg' Copying '/opt/py3/lib/python3.6/site-packages/rest_framework/static/rest_framework/docs/fonts/fontawesome-webfont.ttf' Copying '/opt/py3/lib/python3.6/site-packages/rest_framework/static/rest_framework/docs/fonts/fontawesome-webfont.woff' Copying '/opt/py3/lib/python3.6/site-packages/rest_framework/static/rest_framework/docs/fonts/glyphicons-halflings-regular.eot' Copying '/opt/py3/lib/python3.6/site-packages/rest_framework/static/rest_framework/docs/fonts/glyphicons-halflings-regular.svg' Copying '/opt/py3/lib/python3.6/site-packages/rest_framework/static/rest_framework/docs/fonts/glyphicons-halflings-regular.ttf' Copying '/opt/py3/lib/python3.6/site-packages/rest_framework/static/rest_framework/docs/fonts/glyphicons-halflings-regular.woff' Copying '/opt/py3/lib/python3.6/site-packages/rest_framework/static/rest_framework/docs/fonts/glyphicons-halflings-regular.woff2' Copying '/opt/py3/lib/python3.6/site-packages/rest_framework/static/rest_framework/docs/img/favicon.ico' Copying '/opt/py3/lib/python3.6/site-packages/rest_framework/static/rest_framework/docs/img/grid.png' Copying '/opt/py3/lib/python3.6/site-packages/rest_framework/static/rest_framework/docs/js/api.js' Copying '/opt/py3/lib/python3.6/site-packages/rest_framework/static/rest_framework/docs/js/bootstrap.min.js' Copying '/opt/py3/lib/python3.6/site-packages/rest_framework/static/rest_framework/docs/js/highlight.pack.js' Copying '/opt/py3/lib/python3.6/site-packages/rest_framework/s
franket
2022/07/11
2400
JS一些插件收集
2017-10-30更新 Blueimp jquery相册插件 http://blueimp.github.io/Gallery/ bootstrap-markdown bootstrap的markdown插件 http://www.codingdrama.com/bootstrap-markdown/ bootstrap-tagsinput bootstrap的标签添加与删除插件 http://bootstrap-tagsinput.github.io/bootstrap-tagsinput/exa
治电小白菜
2020/08/25
10.5K0
基于AdminLTE的开发框架-AdminEAP
最近在研究使用AdminLTE框架化,本文讲解使用sitemesh3使AdminLTE框架化的过程。系统架构为:SpringMVC+Spring+Hibernate+Maven+FreeMarker+Sitemesh
全栈程序员站长
2022/09/18
1.5K0
基于AdminLTE的开发框架-AdminEAP
Install Jumpserver
Jumpserver 基于 Python / Django 进行开发,遵循 Web 2.0 规范,配备了 Web Terminal 解决方案
franket
2021/08/10
1.2K0
adminLTE的介绍
adminLTE的官方网站:adminLTE官方网站 和github:adminLTE的github
全栈程序员站长
2022/09/19
2.9K0
Install Jumpserver45
Copying '/opt/py3/lib/python3.6/site-packages/rest_framework_swagger/static/rest_framework_swagger/lang/it.js' Copying '/opt/py3/lib/python3.6/site-packages/rest_framework_swagger/static/rest_framework_swagger/lang/ja.js' Copying '/opt/py3/lib/python3.6/site-packages/rest_framework_swagger/static/rest_framework_swagger/lang/ko-kr.js' Copying '/opt/py3/lib/python3.6/site-packages/rest_framework_swagger/static/rest_framework_swagger/lang/pl.js' Copying '/opt/py3/lib/python3.6/site-packages/rest_framework_swagger/static/rest_framework_swagger/lang/pt.js' Copying '/opt/py3/lib/python3.6/site-packages/rest_framework_swagger/static/rest_framework_swagger/lang/ru.js' Copying '/opt/py3/lib/python3.6/site-packages/rest_framework_swagger/static/rest_framework_swagger/lang/tr.js' Copying '/opt/py3/lib/python3.6/site-packages/rest_framework_swagger/static/rest_framework_swagger/lang/translator.js' Copying '/opt/py3/lib/python3.6/site-packages/rest_framework_swagger/static/rest_framework_swagger/lang/zh-cn.js' Copying '/opt/py3/lib/python3.6/site-packages/rest_framework_swagger/static/rest_framework_swagger/lib/backbone-min.js' Copying '/opt/py3/lib/python3.6/site-packages/rest_framework_swagger/static/rest_framework_swagger/lib/handlebars-2.0.0.js' Copying '/opt/py3/lib/python3.6/site-packages/rest_framework_swagger/static/rest_framework_swagger/lib/highlight.9.1.0.pack.js' Copying '/opt/py3/lib/python3.6/site-packages/rest_framework_swagger/static/rest_framework_swagger/lib/highlight.9.1.0.pack_extended.js' Copying '/opt/py3/lib/python3.6/site-packages/rest_framework_swagger/static/rest_framework_swagger/lib/jquery-1.8.0.min.js' Copying '/opt/py3/lib/python3.6/site-packages/rest_framework_swagger/static/rest_framework_swagger/lib/jquery.ba-bbq.min.js' Copying '/opt/py3/lib/python3.6/site-packages/rest_framework_swagger/static/rest_framework_swagger/lib/jquery.slideto.min.js' Copying '/opt/py3/lib/python3.6/site-packages/rest_framework_swagger/static/rest_framework_swagger/lib/jquery.wiggle.min.js' Copying '/opt/py3/lib/pyth
franket
2022/07/11
2060
jumpserver2.2.2安装
wget https://github.com/jumpserver/jumpserver/releases/download/v2.2.2/jumpserver-v2.2.2.tar.gz
buiu
2022/01/13
1.2K0
在k8s上部署Jumpserver
本次演示环境使用Jumpserver版本:v2.15.4 设置k8s节点包括1台master和1台worker; 应用部署控制管理器使用deployment; 持久化存储使用hostPath写入到NFS挂载目录。 NFS挂载方式如下: 在master配置了nfs服务,并将nfs共享目录/nfs_storage挂在到了两个节点中的/opt/nfs; 如下图所示:
范一刀
2021/12/01
1.8K0
在k8s上部署Jumpserver
前端框架AdminLTE
https://github.com/almasaeed2010/AdminLTE/releases
全栈程序员站长
2022/09/18
2.6K0
前端框架AdminLTE
大型项目技术栈第一讲 Vue.js的使用
Vue.js是一个构建数据驱动的 web 界面的渐进式框架。Vue.js 的目标是通过尽可能简单的 API 实现响应的数据绑定和组合的视图组件。它不仅易于上手,还便于与第三方库或既有项目整合。
易兮科技
2020/09/27
5.2K0
大型项目技术栈第一讲  Vue.js的使用
JumpServer 堡垒机--CentOS 8 安装部署(四)
Jumpserver是一款由python编写, Django开发的开源跳板机/堡垒机系统, 助力互联网企业高效 用户、资产、权限、审计 管理。jumpserver实现了跳板机应有的功能,基于ssh协议来管理,客户端无需安装agent。
Kevin song
2020/06/17
2.6K0
Centos下堡垒机Jumpserver V3.0环境部署完整记录(1)-安装篇
Jumpserver是一款由python编写, Django开发的开源跳板机/堡垒机系统, 助力互联网企业高效 用户、资产、权限、审计 管理。jumpserver实现了跳板机应有的功能,基于ssh协议来管理,客户端无需安装agent。 Jumpserver特点: 1)完全开源,GPL授权 2)Python编写,容易再次开发 3)实现了跳板机基本功能,身份认证、访问控制、授权、审计 、批量操作等。 4)集成了Ansible,批量命令等 5)支持WebTerminal 6)Bootstrap编写,界面美
洗尽了浮华
2018/01/22
4.1K0
Centos下堡垒机Jumpserver V3.0环境部署完整记录(1)-安装篇
Jumpserver开源跳板机安装
Jumpserver 是全球首款完全开源的堡垒机,使用 GNU GPL v2.0 开源协议,是符合4A的专业运维审计系统。其使用 Python / Django 进行开发,遵循 Web 2.0 规范,配备了业界领先的 Web Terminal 解决方案,交互界面美观、用户体验好。并且采纳分布式架构,支持多机房跨区域部署,中心节点提供 API,各机房部署登录节点,可横向扩展、无并发访问限制。
子润先生
2021/07/08
1.4K0
超详细:自动化运维之jumpserver堡垒机入门到掌握
1.3 建立 Python 虚拟环境 因为 CentOS 7 自带的是 Python2, 而 Yum 等工具依赖原来的 Python, 为了不扰乱原来的环境我们来使用 Python 虚拟环境
迅达集团
2019/03/18
3.9K0
Jumpserver简介,部署及使用
建议使用 Docker 部署 Guacamole 组件 , 部分环境可能无法正常编译安装
iginkgo18
2020/11/12
3.3K0
Jumpserver简介,部署及使用
Install Jumpserver48
TaskPool: Apply <function _fast_trace_task at0x7faa22f8aea0> (args:('assets.tasks.test_system_user_connectability_period', 'ce3795ce-96e2-475f-944f-4cb9cc462cbd', {'lang': 'py', 'task': 'assets.tasks.test_system_user_connectability_period', 'id': 'ce3795ce-96e2-475f-944f-4cb9cc462cbd', 'eta': None, 'expires': None, 'group': None, 'retries': 0, 'timelimit': [None, None], 'root_id': 'ce3795ce-96e2-475f-944f-4cb9cc462cbd', 'parent_id': None, 'argsrepr': '()', 'kwargsrepr': '{}', 'origin': 'gen22572@h165', 'reply_to': '07fc10f1-4f00-3fe0-b8d1-c98b94e70bb3', 'correlation_id': 'ce3795ce-96e2-475f-944f-4cb9cc462cbd', 'delivery_info': {'exchange': '', 'routing_key': 'celery', 'priority': 0, 'redelivered': None}}, b'\x80\x02)}q\x00}q\x01(X\t\x00\x00\x00callbacksq\x02NX\x08\x00\x00\x00errbacksq\x03NX\x05\x00\x00\x00chainq\x04NX\x05\x00\x00\x00chordq\x05Nu\x87q\x06.', 'application/x-python-serialize', 'binary') kwargs:{}) Task accepted: assets.tasks.test_admin_user_connectability_period[28cbd1e8-7543-404e-b177-09d94155e31f] pid:22609 Received task: terminal.tasks.delete_terminal_status_period[10a7c66d-0877-4fda-bd24-2a9ac3a96e34] TaskPool: Apply <function _fast_trace_task at0x7faa22f8aea0> (args:('terminal.tasks.delete_terminal_status_period', '10a7c66d-0877-4fda-bd24-2a9ac3a96e34', {'lang': 'py', 'task': 'terminal.tasks.delete_terminal_status_period', 'id': '10a7c66d-0877-4fda-bd24-2a9ac3a96e34', 'eta': None, 'expires': None, 'group': None, 'retries': 0, 'timelimit': [None, None], 'root_id': '10a7c66d-0877-4fda-bd24-2a9ac3a96e34', 'parent_id': None, 'argsrepr': '()', 'kwargsrepr': '{}', 'origin': 'gen22572@h165', 'reply_to': '07fc10f1-4f00-3fe0-b8d1-c98b94e70bb3', 'correlation_id': '10a7c66d-0877-4fda-bd24-2a9ac3a96e34', 'delivery_info': {'exchange': '', 'routing_key': 'celery', 'priority': 0, 'redelivered': None}}, b'\x80\x02)}q\x00}q\x01(X\t\x00\x00\x00callbacksq\x02NX\x08\x00\x00\x00errbacksq\x03NX\x05\x00\x00\x00chainq\x04NX\x05\x00\x00\x00chordq\x05Nu\x87q\x06.', 'application/x-python-serialize', 'binary') kwargs:{}
franket
2022/07/11
2050
相关推荐
Install Jumpserver42
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档