Android学习之——画笔样式

画笔的基本属性 

        mPaint.setStrokeWidth(10);//设置画笔宽度
        mPaint.setColor(Color.BLUE);//设置画笔颜色
        mPaint.setStyle(Paint.Style.STROKE);//设置画笔样式

        mPaint.setTextSize();//字体大小
        mPaint.setTextAlign();//对齐方式
        mPaint.setShadowLayer();//阴影
        mPaint.setUnderlineText();//是否显示下划线
        mPaint.setFakeBoldText();//true 表示粗体,false表示正常
        mPaint.setTextSkewX();//float,设置文本在水平方向上的倾斜,负数表示右斜,正数表示左斜
        mPaint.setTextScaleX();//设置比例因子,默认为1,当大于1的时候表示横向拉伸,
// 当小于1的时候表示横向压缩。该方法往往用于一些特效字体的显示场合。
        mPaint.setStrikeThruText();//设置文本删除线
        mPaint.setLetterSpacing();//设置行间距,默认是0.
        mPaint.setTypeface();//设置文本字体样式
        mPaint.setLinearText();//设置是否打开线性文本标识
        mPaint.setHinting();//设置画笔的隐藏模式
        mPaint.setFontFeatureSettings();//设置字体的样式,这个样式和CSS样式很类似
        mPaint.setStrokeMiter(float miter);//设置笔画的倾斜度

画环形文字

        Path path1 = new Path();
        path1.addCircle(400 , 400 ,300 , Path.Direction.CW); //画路径
        Path path2 = new Path();
        path2.addCircle(400 , 1200 ,300 ,Path.Direction.CCW); //画路径
        canvas.drawCircle(400,400 ,300 ,mPaint);   //画圆
        canvas.drawCircle(400, 1200 ,300 ,mPaint); //画圆
        canvas.drawPoint( 400 , 400 ,mPaint);  //画点
        canvas.drawPoint(400 , 1200 ,mPaint);  //画点
        canvas.drawTextOnPath("学习Android 绘图!",path1,0,0, mPaint);   //画环形文字
        canvas.drawTextOnPath("学习Android 绘图!",path2,-50,-50, mPaint); //画环形文字
//        canvas.drawTextOnPath(文字,路径,横向偏移量,纵向偏移量,画布);

Canvas

//           (1)Canvas平移
          canvas.drawRect(300 ,300 ,800 ,800 ,mPaint);
          mPaint.setColor(Color.BLUE);
          canvas.translate(100 ,100 );
          canvas.drawRect( 300 ,300 ,800 ,800 ,mPaint);
//           (2)Canvas缩放
          canvas.scale(0.5f , 0.5f , 550 ,550);
          mPaint.setColor(Color.RED);
          canvas.drawRect( 300 ,300 ,800 ,800 ,mPaint);
//           (3)Canvas旋转
          canvas.rotate(-10);
          canvas.drawRect(300 ,300 ,800 ,800 ,mPaint);
          canvas.rotate(-20 , 550 ,550);
          canvas.drawRect(300 ,300 ,800 ,800 ,mPaint);
//           (4)Canvas角度倾斜画布
          canvas.save();
          canvas.skew( 0 ,tan(60));
          canvas.drawRect(300 ,300 ,800 ,800 ,mPaint);
          canvas.restore();

 public float tan(int degree){
        return (float) Math.tan(degree*1.0/180*Math.PI);
    }

接下来,就是我们最常用到的渐变了,一起来学习一下!

线性渐变

        LinearGradient linearGradient = new LinearGradient(100 , 100 ,300 ,300 , Color.RED , Color.BLUE , Shader.TileMode.MIRROR);
//        LinearGradient linearGradient = new LinearGradient(起点X轴 ,起点Y轴 ,终点X轴 ,终点Y轴 ,颜色1, 颜色2 ,渐变样式);
        mPaint.setShader(linearGradient);
        canvas.drawCircle(200 , 200 ,100  , mPaint);

 

自定义渐变

当然,如果要多种颜色或者自定义渐变范围的话也是可以的!

但必须注意的是,color的长度必须和fw的长度一致,否则会直接闪退!

        int[] color = { Color.BLUE , Color.RED , Color.MAGENTA , Color.GRAY};
        float[] fw = {0f , 0.2f , 0.5f , 1.0f };
        LinearGradient linearGradient = new LinearGradient(100 , 100 ,300 ,300 , color, fw , Shader.TileMode.CLAMP);
        mPaint.setShader(linearGradient);
        canvas.drawRect(100 ,100 ,300 ,300 ,mPaint);

我们注意到,LinearGradient 方法中最好一个参数是一个枚举类型,其中有三个参数可选,我们来看一下效果!

        int[] color = { Color.BLUE , Color.RED , Color.MAGENTA , Color.GRAY};
        float[] fw = {0f , 0.3f , 0.6f , 1.0f };
        LinearGradient linearGradient = new LinearGradient(100 , 100 ,200,200 , color, fw , Shader.TileMode.CLAMP);
        mPaint.setShader(linearGradient);
        canvas.drawRect(100 ,100 ,300 ,300 ,mPaint);

           CLAMP                    REPEAT                         MIRROR

渐变字体

   int[] color = { Color.BLUE , Color.RED , Color.MAGENTA , Color.GRAY};
        float[] fw = {0f , 0.3f , 0.6f , 1.0f };
        LinearGradient linearGradient = new LinearGradient(0 , 0 ,getMeasuredHeight() ,0 , color, fw , Shader.TileMode.CLAMP);
        mPaint.setShader(linearGradient);
        canvas.drawText("Android 渐变字体"  , 0 , getMeasuredHeight()/2 , mPaint);

SweepGradient扫描渐变

和以上渐变差不多,SweepGradient也支持多色渐变!

        int[] color = { Color.BLUE , Color.RED , Color.MAGENTA , Color.GRAY};
        float[] fw = {0f , 0.3f , 0.6f , 1.0f };
//        SweepGradient gradient = new SweepGradient(450 , 450 ,Color.RED , Color.GREEN);
        SweepGradient gradient = new SweepGradient(450 , 450 ,color , fw);
        mPaint.setShader(gradient);
        canvas.drawCircle(450 ,450 ,450 , mPaint);

效果是这样子的!

RadialGradient放射渐变

RadialGradient gradient = new RadialGradient(450 , 450 ,450,Color.RED , Color.BLUE ,Shader.TileMode.CLAMP);
mPaint.setShader(gradient);
canvas.drawCircle(450 , 450 , 450 , mPaint);

和以上渐变差不多,RadialGradient也支持多色渐变!

float curx = 0 ;
float cury = 0;
float heigth = 0;
float radius;
float width = 0;
float tradius;
ValueAnimator valueAnimator = null;
RadialGradient radialGradient;


 @Override
    protected void onDraw(android.graphics.Canvas canvas) {
        super.onDraw(canvas);
        canvas.drawCircle(curx,cury,tradius,mPaint);
    }



@Override
    public boolean onTouchEvent(MotionEvent event) {
        if (valueAnimator != null && valueAnimator.isRunning()){
            valueAnimator.cancel();
        }
        curx = event.getX();
        cury = event.getY();
        float maxRadius = 0;
        float maxRadius2 = 0;
        if ((width -curx) > curx){
            maxRadius = width -curx;
        }else{
            maxRadius = curx;
        }

        if ((heigth -cury) > cury){
            maxRadius2 = heigth -cury;
        }else{
            maxRadius2 = cury;
        }

        radius = Math.max(maxRadius, maxRadius2);
        valueAnimator = ValueAnimator.ofFloat(1,radius);
        valueAnimator.setDuration(1000);
        valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
            @Override
            public void onAnimationUpdate(ValueAnimator animation) {
                tradius = (Float) animation.getAnimatedValue();
                radialGradient = new RadialGradient(curx,cury, tradius,Color.BLUE,Color.GREEN, Shader.TileMode.CLAMP);
                mPaint.setShader(radialGradient);
                invalidate();
            }
        });

        valueAnimator.addListener(new AnimatorListenerAdapter() {
            @Override
            public void onAnimationCancel(Animator animation) {
                super.onAnimationCancel(animation);
                mPaint.setShader(null);
                tradius = 0;
                invalidate();
            }

            @Override
            public void onAnimationEnd(Animator animation) {
                super.onAnimationEnd(animation);
                mPaint.setShader(null);
                tradius = 0;
                invalidate();
            }

            @Override
            public void onAnimationStart(Animator animation) {
                super.onAnimationStart(animation);
            }
        });
        valueAnimator.start();

        return super.onTouchEvent(event);
    }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值