Android的颜色更顺畅 [英] Android color smoother

查看:152
本文介绍了Android的颜色更顺畅的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

这是一个有点难以解释我的问题,所以我会用一些图片显示它。我做了这个位图:

和我想画的光里面的一个圆圈,用这个code:

 矩形bounds1 =新的矩形(X,Y,X + bit.getWidth(),Y + bit.getHeight());
        的for(int i = bounds1.left; I< bounds1.right;我++){
            对于(INT J = bounds1.top; J< bounds1.bottom; J ++){
                INT结果=(int)的的Math.sqrt((×2-ⅰ)*(×2-I)+(Y2-J)*(Y2-j)条);
                如果(结果< = 120){
                      INT像素=(bit.getPixel第(i-t,J-γ));

                      int的A,R,G,B;

                      INT不同的结果= / 10;
                      //改变各成分的值
                      一个= Color.alpha(象素);

                      R = Color.red(象素)+ RN;
                      G = Color.green(像素)+ GN;
                      B = Color.blue(像素)+ BN;

                      // R,G,B值,它们超出范围0到255应该设置为0或255
                      如果(R> = 256){
                          R = 255;
                      }否则如果(为r 0){
                          使r = 0;
                      }

                      如果(g取代; = 256){
                          G = 255;
                      }否则如果(克℃,){
                          克= 0;
                      }

                      如果(B个= 256){
                          B = 255;
                      }否则如果(b将0){
                          B = 0;
                      }

                    bit.setPixel第(i-t,J-Y,Color.argb(A,R,G,B));
                }
            }
 

我成功地创造出这样的:

现在,我试图让光球更顺畅并没有那么平静,所以它不会看起来像一个圆圈,任何人有任何想法我怎么能做到这一点?我试过很多东西,但没有制定。

绘制整个code:

 公共类CreatorView扩展视图
 

{

 上下文℃;


布尔的quickfix = FALSE;
布尔bin_isEmpty =真;
布尔iftrue = FALSE;
布尔stopnow = FALSE;
布尔按钮pressed = FALSE;
字符串arrowcheck =;
INT screenw;
INT screenh;
INT pixelx;
诠释pixely;
INT smallpixelx;
诠释smallpixely;
点arrowsp;
涂料paintblock;
INT currentColor = 0;
INT×2 = 120;
INT Y2 = 120;

INT RN = 60;
INT GN = 45;
诠释亿= 30;

 位图tileBitmap;
 位图lightBitmap;
 RectF lightRect;
 油漆paint0 =新的油漆(Paint.ANTI_ALIAS_FLAG);
 油漆paint1 =新的油漆(Paint.ANTI_ALIAS_FLAG);

位图山顶;
位图mountainbottom;


位图草;
位图污物;
位图DIRT2;
位图dirt3;
位图stonegrass;
位图石;
位图stone2;
位图stone3;
位图stone4;
位图云;
位图bin_Empty;
位图bin_Full;
位图arrowno;
位图arrown;
位图arrowl;
位图arrowr;
位图arrowu;
位图arrowd;
位图arrowul;
位图arrowur;
位图保存;
位图fliph;
位图flipv;
位图Rotatef;
位图Rotateb;
位图arrowdl;
位图arrowdr;
位图grassSide;
位图grassTop;
位图橙色;
位图的蓝色;
位图smallpixel;
位图PixelDetect;
位图colorpick;
位图刷;
位图brushcolor;
位图火炬;

Map.Entry的< CreatorBlock,点> currentBlock;
Map.Entry的< CreatorBlock,点> lastBlock;
地图< CreatorBlock,点> grassblock =新的HashMap< CreatorBlock,点>();
地图< CreatorBlock,点> stonegrassblock =新的HashMap< CreatorBlock,点>();
地图< CreatorBlock,点> dirtblock =新的HashMap< CreatorBlock,点>();
地图< CreatorBlock,点> stoneblock =新的HashMap< CreatorBlock,点>();
地图< CreatorBlock,点> grassSideBlock =新的HashMap< CreatorBlock,点>();
地图< CreatorBlock,点> grassTopBlock =新的HashMap< CreatorBlock,点>();
地图< CreatorBlock,点> orangeBlock =新的HashMap< CreatorBlock,点>();
地图< CreatorBlock,点> blueBlock =新的HashMap< CreatorBlock,点>();

地图< BackBlock,点> mountaintopBack =新的HashMap< BackBlock,点>();
地图< BackBlock,点> mountainbottomBack =新的HashMap< BackBlock,点>();

地图< BackBlock,点> torchBack =新的HashMap< BackBlock,点>();

地图< CreatorBlock,点> levelMap =新的HashMap< CreatorBlock,点>();
名单<菜单按钮> menuButtonList =新的ArrayList<菜单按钮>();


公共CreatorView(上下文C){
    超级(C);
    this.c = C;


    窗口管理WM =(窗口管理器)c.getSystemService(Context.WINDOW_SERVICE);
    显示显示= wm.getDefaultDisplay();
    this.screenw = display.getWidth();
    this.screenh = display.getHeight();

    this.PixelDetect = BitmapFactory.de codeResource(getResources(),R.drawable.custom_pixel);
    this.smallpixel = Bitmap.createScaledBitmap(PixelDetect,3,3,FALSE);


    this.grass = BitmapFactory.de codeResource(getResources(),R.drawable.block_grass);
    this.grassSide = BitmapFactory.de codeResource(getResources(),R.drawable.block_grassside);
    this.grassTop = BitmapFactory.de codeResource(getResources(),R.drawable.block_grasstop);
    this.orange = BitmapFactory.de codeResource(getResources(),R.drawable.block_cube1);
    this.blue = BitmapFactory.de codeResource(getResources(),R.drawable.block_bluecube);
    this.dirt = BitmapFactory.de codeResource(getResources(),R.drawable.block_dirt);
    this.dirt2 = BitmapFactory.de codeResource(getResources(),R.drawable.block_dirt2);
    this.dirt3 = BitmapFactory.de codeResource(getResources(),R.drawable.block_dirt3);
    this.stonegrass = BitmapFactory.de codeResource(getResources(),R.drawable.block_stonegrass);
    this.stone = BitmapFactory.de codeResource(getResources(),R.drawable.block_stone);
    this.stone2 = BitmapFactory.de codeResource(getResources(),R.drawable.block_stone2);
    this.stone3 = BitmapFactory.de codeResource(getResources(),R.drawable.block_stone3);
    this.stone4 = BitmapFactory.de codeResource(getResources(),R.drawable.block_stone4);
    this.mountaintop = BitmapFactory.de codeResource(getResources(),R.drawable.back_mountaintop);
    this.mountainbottom = BitmapFactory.de codeResource(getResources(),R.drawable.back_mountainbottom);
    this.arrowno = BitmapFactory.de codeResource(getResources(),R.drawable.arrow_noclick);
    this.arrown = BitmapFactory.de codeResource(getResources(),R.drawable.arrow_normal);
    this.arrowl = BitmapFactory.de codeResource(getResources(),R.drawable.arrow_left);
    this.arrowr = BitmapFactory.de codeResource(getResources(),R.drawable.arrow_right);
    this.arrowu = BitmapFactory.de codeResource(getResources(),R.drawable.arrow_up);
    this.arrowd = BitmapFactory.de codeResource(getResources(),R.drawable.arrow_down);
    this.arrowul = BitmapFactory.de codeResource(getResources(),R.drawable.arrow_upperleft);
    this.arrowur = BitmapFactory.de codeResource(getResources(),R.drawable.arrow_upperright);
    this.arrowdl = BitmapFactory.de codeResource(getResources(),R.drawable.arrow_downleft);
    this.arrowdr = BitmapFactory.de codeResource(getResources(),R.drawable.arrow_downright);
    this.arrowno = Bitmap.createScaledBitmap(arrowno,arrowno.getWidth()* 3,arrowno.getHeight()* 3,FALSE);
    this.save = BitmapFactory.de codeResource(getResources(),R.drawable.button_save);
    this.brush = BitmapFactory.de codeResource(getResources(),R.drawable.menu_brush);
    this.brushcolor = BitmapFactory.de codeResource(getResources(),R.drawable.menu_brush_color);
    this.colorpick = BitmapFactory.de codeResource(getResources(),R.drawable.menu_colorpicker);
    this.torch = BitmapFactory.de codeResource(getResources(),R.drawable.item_torch);
    this.save = BitmapFactory.de codeResource(getResources(),R.drawable.button_save);
    this.fliph = BitmapFactory.de codeResource(getResources(),R.drawable.menu_fliph);
    this.flipv = BitmapFactory.de codeResource(getResources(),R.drawable.menu_flipv);
    this.Rotatef = BitmapFactory.de codeResource(getResources(),R.drawable.menu_rotatef);
    this.Rotateb = BitmapFactory.de codeResource(getResources(),R.drawable.menu_rotateb);
    this.bin_Empty = BitmapFactory.de codeResource(getResources(),R.drawable.bin_empty);
    this.bin_Full = BitmapFactory.de codeResource(getResources(),R.drawable.bin_full);
    this.bin_Empty = Bitmap.createScaledBitmap(bin_Empty,bin_Empty.getWidth()* 3,bin_Empty.getHeight()* 3,FALSE);
    this.bin_Full = Bitmap.createScaledBitmap(bin_Full,bin_Full.getWidth()* 3,bin_Full.getHeight()* 3,FALSE);
    this.brush = Bitmap.createScaledBitmap(刷,brush.getWidth()* 3,brush.getHeight()* 3,FALSE);
    this.brushcolor = Bitmap.createScaledBitmap(brushcolor,brushcolor.getWidth()* 3,brushcolor.getHeight()* 3,FALSE);
    this.colorpick = Bitmap.createScaledBitmap(colorpick,colorpick.getWidth()* 3,colorpick.getHeight()* 3,FALSE);
    this.fliph = Bitmap.createScaledBitmap(fliph,fliph.getWidth()* 3,fliph.getHeight()* 3,FALSE);
    this.flipv = Bitmap.createScaledBitmap(flipv,flipv.getWidth()* 3,flipv.getHeight()* 3,FALSE);
    this.Rotateb = Bitmap.createScaledBitmap(Rotateb,Rotateb.getWidth()* 3,Rotateb.getHeight()* 3,FALSE);
    this.Rotatef = Bitmap.createScaledBitmap(Rotatef,Rotatef.getWidth()* 3,Rotatef.getHeight()* 3,FALSE);
    this.arrown = Bitmap.createScaledBitmap(arrown,arrown.getWidth()* 3,arrown.getHeight()* 3,FALSE);
    this.arrowl = Bitmap.createScaledBitmap(arrowl,arrowl.getWidth()* 3,arrowl.getHeight()* 3,FALSE);
    this.arrowr = Bitmap.createScaledBitmap(arrowr,arrowr.getWidth()* 3,arrowr.getHeight()* 3,FALSE);
    this.arrowu = Bitmap.createScaledBitmap(arrowu,arrowu.getWidth()* 3,arrowu.getHeight()* 3,FALSE);
    this.arrowd = Bitmap.createScaledBitmap(arrowd,arrowd.getWidth()* 3,arrowd.getHeight()* 3,FALSE);
    this.arrowul = Bitmap.createScaledBitmap(arrowul,arrowul.getWidth()* 3,arrowul.getHeight()* 3,FALSE);
    this.arrowur = Bitmap.createScaledBitmap(arrowur,arrowur.getWidth()* 3,arrowur.getHeight()* 3,FALSE);
    this.arrowdl = Bitmap.createScaledBitmap(arrowdl,arrowdl.getWidth()* 3,arrowdl.getHeight()* 3,FALSE);
    this.arrowdr = Bitmap.createScaledBitmap(arrowdr,arrowdr.getWidth()* 3,arrowdr.getHeight()* 3,FALSE);

    Menu_Add(arrowno,0,真正的箭头);
    Menu_Add(bin_Empty,1,假的,本);
    Menu_Add(刷,2,假的,刷);
    Menu_Add(brushcolor,2,假的,brushcolor);
    Menu_Add(colorpick,3,假的,colorpick);
    Menu_Add(Rotateb,4,假的,rotateb);
    Menu_Add(Rotatef,5,假的,rotatef);
    Menu_Add(fliph,6,假的,fliph);
    Menu_Add(flipv,7,假的,flipv);
    Menu_Add(grassTop,1,真正的grasstop);
    Menu_Add(grassSide,2,真的,grassside);
    Menu_Add(草,3,真正的草);
    Menu_Add(污垢,4,真正的污垢);
    Menu_Add(stonegrass,5,真正的stonegrass);
    Menu_Add(石,6,真正的石头);
    Menu_Add(橙色,7,真的,橙色);
    Menu_Add(蓝色,8,真正的蓝);
    Menu_Add(山顶,9,真正的山顶);
    Menu_Add(mountainbottom,10,真正的mountainbottom);
    Menu_Add(火炬,11,真正的火炬);
    arrowsp =新的点();
    arrowsp.x = 0;
    arrowsp.y = 0;
      tileBitmap =草;

}
私人无效Menu_Add(位图B,INT秩序,布尔垂直字符串名称)
{
    点P =新的点();
    如果(为了== 0){
        p.x = 0;
        p.y = 0;
        菜单按钮M =新的菜单按钮(秩序,B,垂直,P,姓名);
        menuButtonList.add(米);
    }
    其他{
        对于(菜单按钮M:menuButtonList){
            如果((m.isVertical()==垂直||顺序== 1)及;&安培; m.getOrder()+ 1 ==顺序){
                如果(垂直){
                    p.x = 0;
                    p.y = m.getP()Y + m.getBit()的getHeight()+ 2。
                }
                其他{
                    p.x = m.getP()X + m.getBit()的getWidth()+ 2。
                    p.y = 0;
                }
                菜单按钮M2 =新的菜单按钮(秩序,B,垂直,P,姓名);
                menuButtonList.add(平方米);
                返回;
            }
        }
    }
}
公共无效drawLight(){
    lightBitmap = Bitmap.createBitmap(1500,15000,Bitmap.Config.ARGB_8888);
    帆布CC =新的Canvas(lightBitmap);
    油漆PP =新的油漆(Paint.ANTI_ALIAS_FLAG);
    pp.setMaskFilter(新BlurMaskFilter(20,BlurMaskFilter.Blur.NORMAL));
    对于(Map.Entry的< BackBlock,点>输入:torchBack.entrySet()){
         cc.drawCircle(entry.getValue()X + 6,entry.getValue()Y + 55,第25,第。);
        }
    lightRect =新RectF(-256,-256,lightBitmap.getWidth(),lightBitmap.getHeight());
    lightRect.offset(200,200);
    浮动[]数组= {
            1.2F,0,0,0,1,
            0,1.2f,0,0,1,
            0,0,1.2F,0,1,
            0,0,0,1,0,
    };
    嘉洛斯CCC =新嘉洛斯(阵列);
    ccc.setScale(2,1.5F,1F,1F);
    ColorMatrixColorFilter C4 =新ColorMatrixColorFilter(CCC);
    paint0.setColorFilter(C4);
    paint1.setXfermode(新PorterDuffXfermode(PorterDuff.Mode.DST_IN));

}
@覆盖
保护无效的OnDraw(帆布油画){
    super.onDraw(画布);
    drawLight();
    油漆paintAlpha =新的油漆();
    paintAlpha.setAlpha(200);
    canvas.drawARGB(255,86,194,243);
      drawTiles(帆布,paint0);

      drawTiles(帆布,NULL);

        对于(菜单按钮M:menuButtonList){
            开关(m.getName()){
            案斌:
                如果(bin_isEmpty){
                    canvas.drawBitmap(。bin_Empty,m.getP()X,m.getP()Y,paintAlpha);
                    }
                    其他{
                        canvas.drawBitmap(。bin_Full,m.getP()X,m.getP()Y,paintAlpha);
                    }
                打破;
            案brushcolor:
                canvas.drawBitmap(m.getBit(),m.getP()的x,m.getP()Y,changeBitmapColor(m.getBit(),currentColor));
            打破;
            案箭:
                canvas.drawBitmap(m.getBit(),m.getP()的x,m.getP()y的,paintAlpha);
                开关(arrowcheck){
                案正常:
                    canvas.drawBitmap(arrown,arrowsp.x,arrowsp.y,paintAlpha);
                    打破;
                案左:
                    canvas.drawBitmap(arrowl,arrowsp.x,arrowsp.y,paintAlpha);
                    打破;
                案右:
                    canvas.drawBitmap(arrowr,arrowsp.x,arrowsp.y,paintAlpha);
                    打破;
                案下:
                    canvas.drawBitmap(arrowd,arrowsp.x,arrowsp.y,paintAlpha);
                    打破;
                案涨:
                    canvas.drawBitmap(arrowu,arrowsp.x,arrowsp.y,paintAlpha);
                    打破;
                案UPLEFT:
                    canvas.drawBitmap(arrowul,arrowsp.x,arrowsp.y,paintAlpha);
                    打破;
                案正直:
                    canvas.drawBitmap(arrowur,arrowsp.x,arrowsp.y,paintAlpha);
                    打破;
                案DOWNLEFT:
                    canvas.drawBitmap(arrowdl,arrowsp.x,arrowsp.y,paintAlpha);
                    打破;
                案难搞:
                    canvas.drawBitmap(arrowdr,arrowsp.x,arrowsp.y,paintAlpha);
                    打破;
                }
                打破;
            默认:
                canvas.drawBitmap(m.getBit(),m.getP()的x,m.getP()y的,paintAlpha);
                打破;

            }
            油漆paintRec =新的油漆();
            paintRec.setColor(Color.RED);
            paintRec.setStyle(Style.STROKE);
            paintRec.setStrokeWidth(4);
            paintRec.setStrokeCap​​(Cap.ROUND);
            paintRec.setStrokeJoin(Join.ROUND);
            paintRec.setPathEffect(新DashPathEffect(新浮法[] {} 30,40,0));
            paintRec.setAlpha(5);
            如果(currentBlock!= NULL)
            canvas.drawRect(currentBlock.getValue().x,currentBlock.getValue().y,currentBlock.getValue().x+currentBlock.getKey().getBit().getWidth(),currentBlock.getValue().y+currentBlock.getKey().getBit().getHeight(),paintRec);


        }
        canvas.saveLayer(lightRect,空,Canvas.HAS_ALPHA_LAYER_SAVE_FLAG);
        canvas.cli preCT(lightRect);
        drawTiles(帆布,paint0);
        canvas.drawBitmap(lightBitmap,空,lightRect,paint1);
        canvas.restore();

}
  无效drawTiles(画布油画,涂料P){
      对于(Map.Entry的< BackBlock,点>输入:mountainbottomBack.entrySet()){
            //位图减仓= Bitmap.createScaledBitmap(entry.getKey()GETBIT(),entry.getKey()GETBIT()的getWidth(),entry.getKey()GETBIT()的getHeight(),假的。。。);
            canvas.drawBitmap(entry.getKey()GETBIT(),entry.getValue()的x,entry.getValue()y的,第。);
            }
        对于(Map.Entry的< BackBlock,点>输入:mountaintopBack.entrySet()){
            canvas.drawBitmap(entry.getKey()GETBIT(),entry.getValue()的x,entry.getValue()y的,第。);
            }
        对于(Map.Entry的< CreatorBlock,点>输入:grassblock.entrySet()){
            canvas.drawBitmap(entry.getKey()GETBIT(),entry.getValue()的x,entry.getValue()y的,第。);
        }
        对于(Map.Entry的< CreatorBlock,点>输入:stonegrassblock.entrySet()){
            canvas.drawBitmap(entry.getKey()GETBIT(),entry.getValue()的x,entry.getValue()y的,第。);
            }
        对于(Map.Entry的< CreatorBlock,点>输入:dirtblock.entrySet()){
            canvas.drawBitmap(entry.getKey()GETBIT(),entry.getValue()的x,entry.getValue()y的,第。);
            }
        对于(Map.Entry的< CreatorBlock,点>输入:stoneblock.entrySet()){
            canvas.drawBitmap(entry.getKey()GETBIT(),entry.getValue()的x,entry.getValue()y的,第。);
            }
        对于(Map.Entry的< CreatorBlock,点>输入:grassSideBlock.entrySet()){
            canvas.drawBitmap(entry.getKey()GETBIT(),entry.getValue()的x,entry.getValue()y的,第。);
            }
        对于(Map.Entry的< CreatorBlock,点>输入:grassTopBlock.entrySet()){
            canvas.drawBitmap(entry.getKey()GETBIT(),entry.getValue()的x,entry.getValue()y的,第。);
            }
        对于(Map.Entry的< CreatorBlock,点>输入:orangeBlock.entrySet()){
            canvas.drawBitmap(entry.getKey()GETBIT(),entry.getValue()的x,entry.getValue()y的,第。);
            }
        对于(Map.Entry的< CreatorBlock,点>输入:blueBlock.entrySet()){
            canvas.drawBitmap(entry.getKey()GETBIT(),entry.getValue()的x,entry.getValue()y的,第。);
            }
        对于(Map.Entry的< BackBlock,点>输入:torchBack.entrySet()){
            canvas.drawBitmap(entry.getKey()GETBIT(),entry.getValue()的x,entry.getValue()y的,第。);
            }
    }
 

解决方案

使用自定义的视图,使其更黄见浮法[]数组初始化的注释:

  V类扩展视图{
    涂料paint0;
    涂料paint1;

    公共V(上下文的背景下){
        超(上下文);
        setLayerType(View.LAYER_TYPE_SOFTWARE,NULL);
        paint0 =新的油漆();
        点阵位图= BitmapFactory.de codeResource(getResources(),R.drawable.fykgf);
        着色的着色器=新BitmapShader(位图,Shader.TileMode.REPEAT,Shader.TileMode.REPEAT);
        paint0.setShader(着色);

        paint1 =新的油漆();
        paint1.setMaskFilter(新BlurMaskFilter(50,BlurMaskFilter.Blur.NORMAL));
        浮动[]数组= {
                2,0,0,0,0,
                0,2,0,0,0,
                0,0,2,0,0,//改变2:之间[1..2]东西让它更黄
                0,0,0,1,0,
        };
        paint1.setColorFilter(新ColorMatrixColorFilter(阵列));
        paint1.setShader(着色);
    }

    @覆盖
    保护无效的OnDraw(帆布油画){
        canvas.drawRect(0,0,的getWidth(),的getHeight(),paint0);
        canvas.drawCircle(300,300,150,paint1);
    }
}
 

修改

如果你想几个 Bitmapts 来绘制用:

  V类扩展视图{
    位图tileBitmap;
    位图lightBitmap;
    RectF lightRect;
    油漆paint0 =新的油漆(Paint.ANTI_ALIAS_FLAG);
    油漆paint1 =新的油漆(Paint.ANTI_ALIAS_FLAG);

    公共V(上下文的背景下){
        超(上下文);
// setLayerType(View.LAYER_TYPE_SOFTWARE,NULL);
        tileBitmap = BitmapFactory.de codeResource(getResources(),R.drawable.fykgf);
        lightBitmap = Bitmap.createBitmap(256,256,Bitmap.Config.ARGB_8888);
        帆布C =新的Canvas(lightBitmap);
        涂料P =新的油漆(Paint.ANTI_ALIAS_FLAG);
        p.setMaskFilter(新BlurMaskFilter(20,BlurMaskFilter.Blur.NORMAL));
        c.drawCircle(128,128,100,p)的;
        lightRect =新RectF(0,0,lightBitmap.getWidth(),lightBitmap.getHeight());
        lightRect.offset(200,200);

        浮动[]数组= {
                4,0,0,0,0,
                0,4,0,0,0,
                0,0,0,0,0,
                0,0,0,1,0,
        };
        paint0.setColorFilter(新ColorMatrixColorFilter(阵列));
        paint1.setXfermode(新PorterDuffXfermode(PorterDuff.Mode.DST_IN));
    }

    @覆盖
    保护无效的OnDraw(帆布油画){
        drawTiles(帆布,NULL);

        canvas.saveLayer(lightRect,空,Canvas.HAS_ALPHA_LAYER_SAVE_FLAG);
        canvas.cli preCT(lightRect);
        drawTiles(帆布,paint0);
        canvas.drawBitmap(lightBitmap,空,lightRect,paint1);
        canvas.restore();
    }

    无效drawTiles(画布油画,涂料P){
        //绘制位图在这里...
    }
}
 

It's a bit hard to explain my problem so i'll show it with few pictures. I made this bitmap :

and I wanted to draw a circle of light inside it, using this code:

 Rect bounds1 = new Rect(x, y, x+bit.getWidth(), y+bit.getHeight());
        for (int i = bounds1.left; i < bounds1.right; i++) {
            for (int j = bounds1.top; j < bounds1.bottom; j++) {
                int result=(int) Math.sqrt((x2-i)*(x2-i)+(y2-j)*(y2-j));
                if(result<=120){
                      int pixel = (bit.getPixel(i-x,j-y));

                      int a,r, g, b;

                      int different=result/10;
                      //change the value of each component
                      a=Color.alpha(pixel);

                      r = Color.red(pixel) + rn;
                      g = Color.green(pixel) + gn;
                      b = Color.blue(pixel) + bn;

                      //r,g,b values which are out of the range 0 to 255 should set to 0 or 255
                      if (r >= 256) {
                          r = 255;
                      } else if (r < 0) {
                          r = 0;
                      }

                      if (g >= 256) {
                          g = 255;
                      } else if (g < 0) {
                          g = 0;
                      }

                      if (b >= 256) {
                          b = 255;
                      } else if (b < 0) {
                          b = 0;
                      }

                    bit.setPixel(i-x, j-y, Color.argb(a,r, g, b));
                }
            }

I managed to create this:

Now, I'm trying to make the light ball be smoother and not so rough so it wont look like a circle, anyone has any idea how can I do that? I tried many things but nothing worked out.

whole code of drawing:

public class CreatorView extends View

{

Context c;


boolean quickfix=false;
boolean bin_isEmpty=true;
boolean iftrue=false;
boolean stopnow=false;
boolean buttonpressed=false;
String arrowcheck="";
int screenw;
int screenh;
int pixelx;
int pixely;
int smallpixelx;
int smallpixely;
Point arrowsp;
Paint paintblock;
int currentColor=0;
int x2=120;
int y2=120;

int rn=60;
int gn=45;
int bn=30;

 Bitmap tileBitmap;
 Bitmap lightBitmap;
 RectF lightRect;
 Paint paint0 = new Paint(Paint.ANTI_ALIAS_FLAG);
 Paint paint1 = new Paint(Paint.ANTI_ALIAS_FLAG);   

Bitmap mountaintop;
Bitmap mountainbottom;


Bitmap grass;
Bitmap dirt;
Bitmap dirt2;
Bitmap dirt3;
Bitmap stonegrass;
Bitmap stone;
Bitmap stone2;
Bitmap stone3;
Bitmap stone4;
Bitmap cloud;
Bitmap bin_Empty;
Bitmap bin_Full;
Bitmap arrowno;
Bitmap arrown;
Bitmap arrowl;
Bitmap arrowr;
Bitmap arrowu;
Bitmap arrowd;
Bitmap arrowul;
Bitmap arrowur;
Bitmap save;
Bitmap fliph;
Bitmap flipv;
Bitmap Rotatef;
Bitmap Rotateb;
Bitmap arrowdl;
Bitmap arrowdr;
Bitmap grassSide;
Bitmap grassTop;
Bitmap orange;
Bitmap blue;
Bitmap smallpixel;
Bitmap PixelDetect;
Bitmap colorpick;
Bitmap brush;
Bitmap brushcolor;
Bitmap torch;

Map.Entry<CreatorBlock,Point>currentBlock;
Map.Entry<CreatorBlock,Point>lastBlock;
Map<CreatorBlock, Point> grassblock = new HashMap<CreatorBlock, Point>();
Map<CreatorBlock, Point> stonegrassblock = new HashMap<CreatorBlock, Point>();
Map<CreatorBlock, Point> dirtblock = new HashMap<CreatorBlock, Point>();
Map<CreatorBlock, Point> stoneblock = new HashMap<CreatorBlock, Point>();
Map<CreatorBlock, Point> grassSideBlock = new HashMap<CreatorBlock, Point>();
Map<CreatorBlock, Point> grassTopBlock = new HashMap<CreatorBlock, Point>();
Map<CreatorBlock, Point> orangeBlock = new HashMap<CreatorBlock, Point>();
Map<CreatorBlock, Point> blueBlock = new HashMap<CreatorBlock, Point>();

Map<BackBlock, Point> mountaintopBack = new HashMap<BackBlock, Point>();
Map<BackBlock, Point> mountainbottomBack = new HashMap<BackBlock, Point>();

Map<BackBlock, Point> torchBack = new HashMap<BackBlock, Point>();

Map<CreatorBlock, Point> levelMap = new HashMap<CreatorBlock, Point>();
List<MenuButton>menuButtonList=new ArrayList<MenuButton>();


public CreatorView(Context c) {
    super(c);
    this.c=c;


    WindowManager wm = (WindowManager) c.getSystemService(Context.WINDOW_SERVICE);
    Display display = wm.getDefaultDisplay();
    this.screenw= display.getWidth();
    this.screenh=display.getHeight();

    this.PixelDetect   = BitmapFactory.decodeResource(   getResources(),   R.drawable.custom_pixel);
    this.smallpixel   = Bitmap.createScaledBitmap(PixelDetect, 3, 3, false);


    this.grass=BitmapFactory.decodeResource(getResources(), R.drawable.block_grass);
    this.grassSide=BitmapFactory.decodeResource(getResources(), R.drawable.block_grassside);
    this.grassTop=BitmapFactory.decodeResource(getResources(), R.drawable.block_grasstop);
    this.orange=BitmapFactory.decodeResource(getResources(), R.drawable.block_cube1);
    this.blue=BitmapFactory.decodeResource(getResources(), R.drawable.block_bluecube);
    this.dirt=BitmapFactory.decodeResource(getResources(), R.drawable.block_dirt);
    this.dirt2=BitmapFactory.decodeResource(getResources(), R.drawable.block_dirt2);
    this.dirt3=BitmapFactory.decodeResource(getResources(), R.drawable.block_dirt3);
    this.stonegrass=BitmapFactory.decodeResource(getResources(), R.drawable.block_stonegrass);
    this.stone=BitmapFactory.decodeResource(getResources(), R.drawable.block_stone);
    this.stone2=BitmapFactory.decodeResource(getResources(), R.drawable.block_stone2);
    this.stone3=BitmapFactory.decodeResource(getResources(), R.drawable.block_stone3);
    this.stone4=BitmapFactory.decodeResource(getResources(), R.drawable.block_stone4);
    this.mountaintop=BitmapFactory.decodeResource(getResources(), R.drawable.back_mountaintop);
    this.mountainbottom=BitmapFactory.decodeResource(getResources(), R.drawable.back_mountainbottom);
    this.arrowno=BitmapFactory.decodeResource(getResources(), R.drawable.arrow_noclick);
    this.arrown=BitmapFactory.decodeResource(getResources(), R.drawable.arrow_normal);
    this.arrowl=BitmapFactory.decodeResource(getResources(), R.drawable.arrow_left);
    this.arrowr=BitmapFactory.decodeResource(getResources(), R.drawable.arrow_right);
    this.arrowu=BitmapFactory.decodeResource(getResources(), R.drawable.arrow_up);
    this.arrowd=BitmapFactory.decodeResource(getResources(), R.drawable.arrow_down);
    this.arrowul=BitmapFactory.decodeResource(getResources(), R.drawable.arrow_upperleft);
    this.arrowur=BitmapFactory.decodeResource(getResources(), R.drawable.arrow_upperright);
    this.arrowdl=BitmapFactory.decodeResource(getResources(), R.drawable.arrow_downleft);
    this.arrowdr=BitmapFactory.decodeResource(getResources(), R.drawable.arrow_downright);
    this.arrowno=Bitmap.createScaledBitmap(arrowno, arrowno.getWidth()*3, arrowno.getHeight()*3, false);
    this.save=BitmapFactory.decodeResource(getResources(), R.drawable.button_save);
    this.brush=BitmapFactory.decodeResource(getResources(), R.drawable.menu_brush);
    this.brushcolor=BitmapFactory.decodeResource(getResources(), R.drawable.menu_brush_color);
    this.colorpick=BitmapFactory.decodeResource(getResources(), R.drawable.menu_colorpicker);
    this.torch=BitmapFactory.decodeResource(getResources(), R.drawable.item_torch);
    this.save=BitmapFactory.decodeResource(getResources(), R.drawable.button_save);
    this.fliph=BitmapFactory.decodeResource(getResources(), R.drawable.menu_fliph);
    this.flipv=BitmapFactory.decodeResource(getResources(), R.drawable.menu_flipv);
    this.Rotatef=BitmapFactory.decodeResource(getResources(), R.drawable.menu_rotatef);
    this.Rotateb=BitmapFactory.decodeResource(getResources(), R.drawable.menu_rotateb);
    this.bin_Empty=BitmapFactory.decodeResource(getResources(), R.drawable.bin_empty);
    this.bin_Full=BitmapFactory.decodeResource(getResources(), R.drawable.bin_full);
    this.bin_Empty=Bitmap.createScaledBitmap(bin_Empty, bin_Empty.getWidth()*3, bin_Empty.getHeight()*3, false);
    this.bin_Full=Bitmap.createScaledBitmap(bin_Full, bin_Full.getWidth()*3, bin_Full.getHeight()*3, false);
    this.brush=Bitmap.createScaledBitmap(brush, brush.getWidth()*3, brush.getHeight()*3, false);
    this.brushcolor=Bitmap.createScaledBitmap(brushcolor, brushcolor.getWidth()*3, brushcolor.getHeight()*3, false);
    this.colorpick=Bitmap.createScaledBitmap(colorpick, colorpick.getWidth()*3, colorpick.getHeight()*3, false);
    this.fliph=Bitmap.createScaledBitmap(fliph, fliph.getWidth()*3, fliph.getHeight()*3, false);
    this.flipv=Bitmap.createScaledBitmap(flipv, flipv.getWidth()*3, flipv.getHeight()*3, false);
    this.Rotateb=Bitmap.createScaledBitmap(Rotateb, Rotateb.getWidth()*3, Rotateb.getHeight()*3, false);
    this.Rotatef=Bitmap.createScaledBitmap(Rotatef, Rotatef.getWidth()*3, Rotatef.getHeight()*3, false);
    this.arrown=Bitmap.createScaledBitmap(arrown, arrown.getWidth()*3, arrown.getHeight()*3, false);
    this.arrowl=Bitmap.createScaledBitmap(arrowl, arrowl.getWidth()*3, arrowl.getHeight()*3, false);
    this.arrowr=Bitmap.createScaledBitmap(arrowr, arrowr.getWidth()*3, arrowr.getHeight()*3, false);
    this.arrowu=Bitmap.createScaledBitmap(arrowu, arrowu.getWidth()*3, arrowu.getHeight()*3, false);
    this.arrowd=Bitmap.createScaledBitmap(arrowd, arrowd.getWidth()*3, arrowd.getHeight()*3, false);
    this.arrowul=Bitmap.createScaledBitmap(arrowul, arrowul.getWidth()*3, arrowul.getHeight()*3, false);
    this.arrowur=Bitmap.createScaledBitmap(arrowur, arrowur.getWidth()*3, arrowur.getHeight()*3, false);
    this.arrowdl=Bitmap.createScaledBitmap(arrowdl, arrowdl.getWidth()*3, arrowdl.getHeight()*3, false);
    this.arrowdr=Bitmap.createScaledBitmap(arrowdr, arrowdr.getWidth()*3, arrowdr.getHeight()*3, false);

    Menu_Add(arrowno,0,true,"arrows");
    Menu_Add(bin_Empty,1,false,"bin");
    Menu_Add(brush,2,false,"brush");
    Menu_Add(brushcolor,2,false,"brushcolor");
    Menu_Add(colorpick,3,false,"colorpick");
    Menu_Add(Rotateb,4,false,"rotateb");
    Menu_Add(Rotatef,5,false,"rotatef");
    Menu_Add(fliph,6,false,"fliph");
    Menu_Add(flipv,7,false,"flipv");
    Menu_Add(grassTop,1,true,"grasstop");
    Menu_Add(grassSide,2,true,"grassside");
    Menu_Add(grass,3,true,"grass");
    Menu_Add(dirt,4,true,"dirt");
    Menu_Add(stonegrass,5,true,"stonegrass");
    Menu_Add(stone,6,true,"stone");
    Menu_Add(orange,7,true,"orange");
    Menu_Add(blue,8,true,"blue");
    Menu_Add(mountaintop,9,true,"mountaintop");
    Menu_Add(mountainbottom,10,true,"mountainbottom");
    Menu_Add(torch,11,true,"torch");
    arrowsp=new Point();
    arrowsp.x=0;
    arrowsp.y=0;
      tileBitmap = grass;

}
private void Menu_Add(Bitmap b,int order,boolean vertical,String name)
{
    Point p=new Point();
    if(order==0){
        p.x=0;
        p.y=0;
        MenuButton m=new MenuButton(order,b , vertical, p,name);
        menuButtonList.add(m);
    }
    else{
        for (MenuButton m : menuButtonList) {
            if((m.isVertical()==vertical||order==1)&&m.getOrder()+1==order ){
                if(vertical){
                    p.x=0;
                    p.y=m.getP().y+m.getBit().getHeight()+2;
                }
                else{
                    p.x=m.getP().x+m.getBit().getWidth()+2;
                    p.y=0;
                }
                MenuButton m2=new MenuButton(order,b , vertical, p,name);
                menuButtonList.add(m2);
                return;
            }
        }
    }
}
public void drawLight(){
    lightBitmap = Bitmap.createBitmap(1500, 15000, Bitmap.Config.ARGB_8888);
    Canvas cc = new Canvas(lightBitmap);
    Paint pp = new Paint(Paint.ANTI_ALIAS_FLAG);
    pp.setMaskFilter(new BlurMaskFilter(20, BlurMaskFilter.Blur.NORMAL));
    for (Map.Entry<BackBlock, Point> entry : torchBack.entrySet()) {
         cc.drawCircle(entry.getValue().x+6, entry.getValue().y+55, 25, pp);
        }
    lightRect = new RectF(-256, -256, lightBitmap.getWidth(), lightBitmap.getHeight());
    lightRect.offset(200, 200);
    float[] array = {
            1.2f, 0, 0, 0, 1,
            0,1.2f, 0, 0, 1,
            0, 0, 1.2f, 0, 1,
            0, 0, 0, 1, 0,
    };
    ColorMatrix ccc=new ColorMatrix(array);
    ccc.setScale(2, 1.5f, 1f, 1f);
    ColorMatrixColorFilter c4=new ColorMatrixColorFilter(ccc);
    paint0.setColorFilter(c4);
    paint1.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_IN));

}
@Override
protected void onDraw(Canvas canvas) {
    super.onDraw(canvas);
    drawLight();
    Paint paintAlpha = new Paint();
    paintAlpha.setAlpha(200);
    canvas.drawARGB(255, 86, 194, 243);
      drawTiles(canvas, paint0);

      drawTiles(canvas, null);

        for(MenuButton m : menuButtonList){
            switch(m.getName()){
            case "bin":
                if(bin_isEmpty){
                    canvas.drawBitmap(bin_Empty, m.getP().x, m.getP().y,paintAlpha);
                    }
                    else{
                        canvas.drawBitmap(bin_Full, m.getP().x, m.getP().y,paintAlpha);
                    }
                break;
            case "brushcolor":
                canvas.drawBitmap(m.getBit(), m.getP().x,m.getP().y, changeBitmapColor(m.getBit(), currentColor));
            break;
            case "arrows":
                canvas.drawBitmap(m.getBit(),m.getP().x,m.getP().y,paintAlpha);
                switch (arrowcheck) {
                case "normal":
                    canvas.drawBitmap(arrown, arrowsp.x, arrowsp.y,paintAlpha);
                    break;
                case "left":
                    canvas.drawBitmap(arrowl, arrowsp.x, arrowsp.y,paintAlpha);
                    break;
                case "right":
                    canvas.drawBitmap(arrowr, arrowsp.x, arrowsp.y,paintAlpha);
                    break;
                case "down":
                    canvas.drawBitmap(arrowd, arrowsp.x, arrowsp.y,paintAlpha);
                    break;
                case "up":
                    canvas.drawBitmap(arrowu, arrowsp.x, arrowsp.y,paintAlpha);
                    break;
                case "upleft":
                    canvas.drawBitmap(arrowul, arrowsp.x, arrowsp.y,paintAlpha);
                    break;
                case "upright":
                    canvas.drawBitmap(arrowur, arrowsp.x, arrowsp.y,paintAlpha);
                    break;
                case "downleft":
                    canvas.drawBitmap(arrowdl, arrowsp.x, arrowsp.y,paintAlpha);
                    break;
                case "downright":
                    canvas.drawBitmap(arrowdr, arrowsp.x, arrowsp.y,paintAlpha);
                    break;
                }
                break;
            default:
                canvas.drawBitmap(m.getBit(),m.getP().x,m.getP().y,paintAlpha);
                break;

            }
            Paint paintRec = new Paint();
            paintRec.setColor(Color.RED);
            paintRec.setStyle(Style.STROKE);
            paintRec.setStrokeWidth(4);
            paintRec.setStrokeCap(Cap.ROUND);
            paintRec.setStrokeJoin(Join.ROUND);
            paintRec.setPathEffect(new DashPathEffect(new float[] {30,40}, 0));
            paintRec.setAlpha(5);
            if(currentBlock!=null)
            canvas.drawRect(currentBlock.getValue().x,currentBlock.getValue().y,currentBlock.getValue().x+currentBlock.getKey().getBit().getWidth(),currentBlock.getValue().y+currentBlock.getKey().getBit().getHeight(),paintRec);


        }
        canvas.saveLayer(lightRect, null, Canvas.HAS_ALPHA_LAYER_SAVE_FLAG);
        canvas.clipRect(lightRect);
        drawTiles(canvas, paint0);
        canvas.drawBitmap(lightBitmap, null, lightRect, paint1);
        canvas.restore();

}
  void drawTiles(Canvas canvas, Paint p) {
      for (Map.Entry<BackBlock, Point> entry : mountainbottomBack.entrySet()) {
            //Bitmap lighten=Bitmap.createScaledBitmap(entry.getKey().getBit(), entry.getKey().getBit().getWidth(), entry.getKey().getBit().getHeight(), false);
            canvas.drawBitmap(entry.getKey().getBit(), entry.getValue().x,entry.getValue().y, p);
            }
        for (Map.Entry<BackBlock, Point> entry : mountaintopBack.entrySet()) {
            canvas.drawBitmap(entry.getKey().getBit(), entry.getValue().x,entry.getValue().y, p);
            }
        for (Map.Entry<CreatorBlock, Point> entry : grassblock.entrySet()) {
            canvas.drawBitmap(entry.getKey().getBit(), entry.getValue().x,entry.getValue().y, p);
        }
        for (Map.Entry<CreatorBlock, Point> entry : stonegrassblock.entrySet()) {
            canvas.drawBitmap(entry.getKey().getBit(), entry.getValue().x,entry.getValue().y, p);
            }
        for (Map.Entry<CreatorBlock, Point> entry : dirtblock.entrySet()) {
            canvas.drawBitmap(entry.getKey().getBit(), entry.getValue().x,entry.getValue().y, p);
            }
        for (Map.Entry<CreatorBlock, Point> entry : stoneblock.entrySet()) {
            canvas.drawBitmap(entry.getKey().getBit(), entry.getValue().x,entry.getValue().y, p);
            }
        for (Map.Entry<CreatorBlock, Point> entry : grassSideBlock.entrySet()) {
            canvas.drawBitmap(entry.getKey().getBit(), entry.getValue().x,entry.getValue().y, p);
            }
        for (Map.Entry<CreatorBlock, Point> entry : grassTopBlock.entrySet()) {
            canvas.drawBitmap(entry.getKey().getBit(), entry.getValue().x,entry.getValue().y, p);
            }
        for (Map.Entry<CreatorBlock, Point> entry : orangeBlock.entrySet()) {
            canvas.drawBitmap(entry.getKey().getBit(), entry.getValue().x,entry.getValue().y, p);
            }
        for (Map.Entry<CreatorBlock, Point> entry : blueBlock.entrySet()) {
            canvas.drawBitmap(entry.getKey().getBit(), entry.getValue().x,entry.getValue().y, p);
            }
        for (Map.Entry<BackBlock, Point> entry : torchBack.entrySet()) {
            canvas.drawBitmap(entry.getKey().getBit(), entry.getValue().x,entry.getValue().y, p);
            }
    }

解决方案

use this custom View, to make it more yellow see the comment in float[] array initialization:

class V extends View {
    Paint paint0;
    Paint paint1;

    public V(Context context) {
        super(context);
        setLayerType(View.LAYER_TYPE_SOFTWARE, null);
        paint0 = new Paint();
        Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.fykgf);
        Shader shader = new BitmapShader(bitmap, Shader.TileMode.REPEAT, Shader.TileMode.REPEAT);
        paint0.setShader(shader);

        paint1 = new Paint();
        paint1.setMaskFilter(new BlurMaskFilter(50, BlurMaskFilter.Blur.NORMAL));
        float[] array = {
                2, 0, 0, 0, 0,
                0, 2, 0, 0, 0,
                0, 0, 2, 0, 0, // change 2 to: something between [1..2] to get it more yellow
                0, 0, 0, 1, 0,
        };
        paint1.setColorFilter(new ColorMatrixColorFilter(array));
        paint1.setShader(shader);
    }

    @Override
    protected void onDraw(Canvas canvas) {
        canvas.drawRect(0, 0, getWidth(), getHeight(), paint0);
        canvas.drawCircle(300, 300, 150, paint1);
    }
}

EDIT

if you want several Bitmapts to be drawn use this:

class V extends View {
    Bitmap tileBitmap;
    Bitmap lightBitmap;
    RectF lightRect;
    Paint paint0 = new Paint(Paint.ANTI_ALIAS_FLAG);
    Paint paint1 = new Paint(Paint.ANTI_ALIAS_FLAG);

    public V(Context context) {
        super(context);
//        setLayerType(View.LAYER_TYPE_SOFTWARE, null);
        tileBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.fykgf);
        lightBitmap = Bitmap.createBitmap(256, 256, Bitmap.Config.ARGB_8888);
        Canvas c = new Canvas(lightBitmap);
        Paint p = new Paint(Paint.ANTI_ALIAS_FLAG);
        p.setMaskFilter(new BlurMaskFilter(20, BlurMaskFilter.Blur.NORMAL));
        c.drawCircle(128, 128, 100, p);
        lightRect = new RectF(0, 0, lightBitmap.getWidth(), lightBitmap.getHeight());
        lightRect.offset(200, 200);

        float[] array = {
                4, 0, 0, 0, 0,
                0, 4, 0, 0, 0,
                0, 0, 0, 0, 0,
                0, 0, 0, 1, 0,
        };
        paint0.setColorFilter(new ColorMatrixColorFilter(array));
        paint1.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_IN));
    }

    @Override
    protected void onDraw(Canvas canvas) {
        drawTiles(canvas, null);

        canvas.saveLayer(lightRect, null, Canvas.HAS_ALPHA_LAYER_SAVE_FLAG);
        canvas.clipRect(lightRect);
        drawTiles(canvas, paint0);
        canvas.drawBitmap(lightBitmap, null, lightRect, paint1);
        canvas.restore();
    }

    void drawTiles(Canvas canvas, Paint p) {
        // draw your Bitmaps here...
    }
}

这篇关于Android的颜色更顺畅的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆