Android绘制bitmap的问题。 20C

前提是我通过zxing生成了一个300*300的二维码bitmap,然后我想在这个bitmap四周加上文字。如图图片说明,整体生成一个bitmap,请问哪位大神能知道怎么弄

2个回答

你可以利用自定义View,View有一个方法叫做getMatrix();
具体做法如下:
1.自定义一个view,在将这个二维码的bitmap画入;
2.利用drawText()方法加入想要家入的文字(使用代码控制好位置即可);
3.调用getMatrix()方法,获取matrix
4.将matrix通过Bitmap的构造方法,转换成bitmap
5.大功告成

你该用canvas绘制

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
Android OpenGL直接绘制生成Bitmap图片
求大神指教一下。 我刚接触openGL时间不长, 我现在在做一个要用到openGL的项目,现在有一个功能的是:把openGL的绘制直接绘到Bitmap里,而不是通过openGL截屏来生成Bitmap。 在网上找了一个博客:http://blog.csdn.net/helldevil/article/details/7513946?reload 写的比较含糊,我完全不知道怎么弄。大神能告诉我一下具体步骤怎么写的吗?或者有更好的办法也希望告知一下。 感激不尽!
Android中Bitmap.createBitmap引起的频繁GC如何解决
我是在onDraw当中绘制一个动画使一个Bitmap对象同时旋转和移动,于是就使用matrix,matrix完就马上执行Bitmap.createBitmap()方法生成一个新的bitmap并invalidate()通知onDraw重新绘制,但是发觉log中的GC相当的频繁,请问这样会有什么安全隐患,同时求优化的方法,谢谢!
如何将SurfaceView中的Canvas保存为Bitmap?
普通的Canvas可以通过下面的方法来将绘制内容保存为Bitmap ``` Bitmap bitmap = new Bitmap(width, height, Config.ARGB_8888); Canvas canvas = new Canvas(bitmap); canvas.drawXXX ``` 但问题是,SurfaceView中Canvas是通过lockCanvas获取的,请问这种情况下,该如何将Canvas保存为Bitmap呢??
android:用Bitmap+Canvas画出来的东西,有的能打印有的不能打印
下面这段代码目的是想把图片、文字等打印在一张创建的背景图上。怎么有的能打印出来有的不能?请问要怎么做才能把要打印的都打印上去? public void DrawImage() { /*建立画布,画笔,位图初始化*/ bitmap = Bitmap.createBitmap(xp_width, xp_height, Bitmap.Config.ARGB_8888); canvas = new Canvas(bitmap); canvas.drawColor(Color.WHITE); paint = new Paint(); paint.setTextSize(5); /*花两边的圆孔 能打印*/ canvas.drawColor(Color.rgb(223, 233, 235)); for (int y = 5; y < xp_height - 5; y++) { canvas.drawOval(10, y, 24, y + 14, paint); canvas.drawOval(495, y, 509, y + 14, paint); y = y + 27; } /*把头部信息打印在背景图上 能打印*/ bitmap_top = BitmapFactory.decodeResource(getResources(), R.drawable.lishua_top); // 指定图片绘制区域 Rect src_top = new Rect(0, 0, bitmap_top.getWidth(), bitmap_top.getHeight()); // 指定图片在屏幕上显示的区域,四个点的坐标 Rect dst_top = new Rect(45, 15, 475, 55); canvas.drawBitmap(bitmap_top, src_top, dst_top, paint); Log.d("xg", "this is do top"); /*把印章信息打印在背景图上 不能打印*/ bitmap_mark = BitmapFactory.decodeResource(getResources(), R.drawable.lakala_top); // 指定图片绘制区域 Rect src_mark = new Rect(0, 0, bitmap_mark.getWidth(), bitmap_mark.getHeight()); // 指定图片在屏幕上显示的区域,四个点的坐标 Rect dst_mark = new Rect(280, 595, 485, 570); //canvas.rotate(); canvas.drawBitmap(bitmap_mark, src_mark, dst_mark, paint); /* 能打印*/ canvas.drawLine(100,100,200,200,paint); /* 不能打印*/ canvas.drawPoint(100,100,paint); imageView.setImageBitmap(bitmap);
如何在自定义surfaceView 绘图面板上放置图片 或者bitmap
我在涂鸦面板上绘制图片以bitmap形式保存涂鸦 在转变成byte的形式存入数据库请问如何把数据库中的涂鸦再打开显示到绘图面板上 期待各位大神的回复
【Android】View如何实现多个监听以及如何设置Bitmap在视图中的位置?
自定义了一个View,在onTouch方法里执行的是画笔涂鸦的操作,并且在这个View里面绘制了一个Bitmap。现在这个View还需要监听手势实现Bitmap两个手指缩放、拖动的操作。 1. 请问如何实现多个监听,或者两个监听该如何切换? 2. 请问如何设置Bitmap在View中的位置?
Android无容器绘图的方法
有没有一种方法不需要定义容器,直接在原有布局上面绘制图像 用canvas和paint绘制bitmap时需要事先定义容器(?),但是需要绘制的图像不能预先知道位置(前提,不能破坏或覆盖原有布局) 类似于ps上不用新建图层,直接在原有图层上面使用画笔工具
在onDraw()画圆角bitmap会变直角黑边
自定义一个TextView,在onDraw()方法里绘制一个圆角的bitmap,(bitmap是本地的),画上之后 后发现圆角处被补齐了,变成黑色直角了。请问怎么回事?
[Android]如何在canvas上随机drawBitmap,并且每个bitmap都不会被重叠?
敲android还没多久,对于这种问题真的很苦手 我的思路是,定义一个Position类,里面有left top两个属性,再定义一个ArrayList<Positon>数组,在每次random一个bitmap的坐标后,用Position对象存它的left top值,然后再遍历当前的ArrayList,如果新的坐标值和数组中的坐标值产生冲突(就是坐标在能与现有坐标重叠的范围内),我就返回false,重复上述步骤,一直到找到符合条件的坐标 代码是以下: ``` Position zero = new Position(0, 0); positions.add(zero); Random random = new Random(); int count = 0; while (count<index.length){//这个index是一个int数组 int left = random.nextInt(screen_width-105); int topp = random.nextInt(screen_height-105); Position position = new Position(left, topp); if (position.isEmpty()) { canvas.drawBitmap(activity.imgs[count], left, topp,new Paint()); count++; positions.add(position); } } ``` Position的定义是这样的: ``` class Position{ private int left; private int top; public Position(int left, int top){ this.left = left; this.top = top; } public int getLeft(){return left;} public int getTop(){return top;} public void setLeft(int left){ this.left = left; } public void setTop(int top){ this.top = top; } //获取屏幕的 public boolean isEmpty(){//每张图片大小都是105*105, if (top<438||top>245){return false;}//这里是禁止绘制区域 for (Position p : positions){ if (top<438||top>245){ return false; }else if ( left>(p.left-120)&& left<(p.left+120)&& top>(p.top-120)&& top<(p.top+120) ){ return false; } } return true; } ``` 运行是屏幕一片漆黑,就宛如我这个菜鸟脆弱的心。。。。 其实绘制出来过,但是还是好多重叠,后来我发现条件判断那儿好像不对,就把循环条件给改了,然后就黑了
Android:root view (带 ActionBar)的 snapshot
我通过 content view 快速获取 activities 的位图,并且绘制出来: View view = activity.findViewById(android.R.id.content) Bitmap bitmap = Bitmap.createBitmap( view.getWidth(), view.getHeight(), Config.ARGB_8888 ); view.draw(new Canvas(bitmap)); 现在我使用一个 ActionBar,它不是嵌套在 content view 中。怎样才能获得真正的根视图? 或者使用action bar 快速获取一个图片?
android使用Matrix进行图片旋转,空白区域如何透明
我在使用matrix对bitmap进行旋转的时候,图片到旋转成功了,但是空白区域是黑色的,要如何才能设置成透明色? 使用中发现JPG文件的图片出现以上情况,PNG旋转后空白区域是透明的。尝试在android端通过bitmap.compress将JPG转换成PNG在进行旋转,空白区域还是黑色的。 目前使用的方法是先通过decodeFromFile从文件获取bitmap,然后通过算法先计算出旋转后的图片尺寸,按新的尺寸新建一个bitmap。通过canvas绘制旋转后的图片。这样可以实现空白区域透明化,但是一旦图片尺寸过大或者旋转角度大了,就容易内存溢出! 求问该如何解决! 以下是我直接对bitmap进行matrix旋转代码 BitmapFactory.Options tempOpts = new BitmapFactory.Options(); tempOpts.inPurgeable = true; final Bitmap bitmap = BitmapFactory.decodeStream(in, null, tempOpts); Matrix matrix = new Matrix(); matrix.postRotate(45); Bitmap bitmap1 = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, true);
Android 方形图片编程圆形之后,太小了
从本地相册获取的一个图片,进行正方形裁剪后,在用遮罩方式变成圆形,怎么样调整生成圆形之后的圆形图片的大小。 下面是主要代码 /** * 裁剪图片方法实现 * * @param uri */ public void startPhotoZoom(Uri uri) { Intent intent = new Intent("com.android.camera.action.CROP"); intent.setDataAndType(uri, "image/*"); // 设置裁剪 intent.putExtra("crop", "true"); // aspectX aspectY 是宽高的比例 intent.putExtra("aspectX", 1); intent.putExtra("aspectY", 1); // outputX outputY 是裁剪图片宽高 intent.putExtra("outputX", layoutPhoto.getWidth()); intent.putExtra("outputY", layoutPhoto.getHeight()); intent.putExtra("return-data", true); startActivityForResult(intent, RESULT_REQUEST_CODE); } /** * 保存裁剪之后的图片数据 * * @param picdata */ private void getImageToView(Intent data) { Bundle extras = data.getExtras(); if (extras != null) { Bitmap photo = extras.getParcelable("data"); Bitmap bitPhoto = createCirclImage(photo); Drawable drawable = new BitmapDrawable(this.getResources(), bitPhoto); iv_nikePhoto.setImageDrawable(drawable); } } /** * 绘制圆形图片 * * @return */ private Bitmap createCirclImage(Bitmap bitmap) { // // 绘制画笔 int width = layoutPhoto.getWidth(); int height = layoutPhoto.getHeight(); // 绘制圆角矩形 Bitmap roundBitmap = Bitmap.createBitmap(bitmap.getWidth(), bitmap.getHeight(), Config.ARGB_8888); Canvas canvas = new Canvas(roundBitmap); int color = 0xff424242; Paint paint = new Paint(); // 设置圆形半径 int radius; if (bitmap.getWidth() > bitmap.getHeight()) { radius = bitmap.getHeight() / 2; } else { radius = bitmap.getWidth() / 2; } // 绘制圆形 paint.setAntiAlias(true); canvas.drawARGB(0, 0, 0, 0); paint.setColor(color); canvas.drawCircle(bitmap.getWidth() / 2, bitmap.getHeight() / 2, radius, paint); paint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN)); canvas.drawBitmap(bitmap, 0, 0, paint); return roundBitmap; }
怎么在ListView的Item里面去用SurfaceView绘制
package com.example.mysurfaceviewdemo; import java.util.Random; import android.graphics.Bitmap; public class BitmapBubble { private Bitmap mBitmap; private int maxX; private int maxY; private int x; private int y; private boolean isRight = true; private boolean isUp = true; Random random = new Random(); private int speedX = random.nextInt(2)+1; private int speedY = random.nextInt(10)+1; public BitmapBubble(Bitmap mBitmap,int x,int y,int maxX,int maxY){ this.mBitmap = mBitmap; this.x = x; this.y = y; this.maxX = maxX - mBitmap.getWidth(); this.maxY = maxY - mBitmap.getHeight(); } public int getMaxX() { return maxX; } public void setMaxX(int maxX) { this.maxX = maxX; } public int getMaxY() { return maxY; } public void setMaxY(int maxY) { this.maxY = maxY; } public int getX() { x+=speedX; return x; } public int getY() { y-=speedY; return y; } public void setX(int x) { this.x = x; } public void setY(int y) { this.y = y; } public int getSpeedX() { return speedX; } public void setSpeedX(int speedX) { this.speedX = speedX; } public Bitmap getmBitmap() { return mBitmap; } public void setmBitmap(Bitmap mBitmap) { this.mBitmap = mBitmap; } } package com.example.mysurfaceviewdemo; import java.util.ArrayList; import java.util.Random; import android.content.Context; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.graphics.PixelFormat; import android.graphics.PorterDuff.Mode; import android.util.AttributeSet; import android.util.Log; import android.view.SurfaceHolder; import android.view.SurfaceHolder.Callback; import android.view.SurfaceView; import android.view.View; import android.view.ViewGroup; import android.view.ViewGroup.LayoutParams; import android.widget.RelativeLayout; import android.widget.TextView; public class MySurfaceView extends SurfaceView implements Callback,Runnable{ private SurfaceHolder mSurfaceHolder; private Thread mThread; private Canvas canvas; private int ScreenW, ScreenH; private Random random = new Random(); private ArrayList <BitmapBubble> list = new ArrayList<BitmapBubble>(); int maxY; int maxX; int x ; int y ; private boolean hasBitmapBubble = true; private Bitmap mBitmap; private BitmapBubble mBitmapBubble; private int BitmapIds [] = new int []{R.drawable.water,R.drawable.water2,R.drawable.water3,R.drawable.water4}; public MySurfaceView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); initSurfaceView(context); } public MySurfaceView(Context context, AttributeSet attrs) { super(context, attrs); initSurfaceView(context); } public MySurfaceView(Context context) { super(context); initSurfaceView(context); } @Override public void run(){ Canvas canvas = mSurfaceHolder.lockCanvas(); maxX = canvas.getWidth(); maxY = canvas.getHeight(); x = 30; y = maxY-80; mSurfaceHolder.unlockCanvasAndPost(canvas); while(true){ canvas = mSurfaceHolder.lockCanvas(); if(canvas==null){ return; } canvas.drawColor(Color.TRANSPARENT,Mode.CLEAR); for(int j=0; j<list.size();j++){ mBitmapBubble = list.get(j); canvas.drawBitmap(mBitmapBubble.getmBitmap(),mBitmapBubble.getX(), mBitmapBubble.getY(), null); if(mBitmapBubble.getX()>mBitmapBubble.getMaxX()){ list.remove(mBitmapBubble); } if(mBitmapBubble.getY()<0){ list.remove(mBitmapBubble); } } mSurfaceHolder.unlockCanvasAndPost(canvas); try { Thread.sleep(150); } catch (InterruptedException e) { e.printStackTrace(); } } } public void initSurfaceView(Context context){ mSurfaceHolder = this.getHolder(); mSurfaceHolder.addCallback(this); this.setZOrderOnTop(true);//设置画布 背景透明 this.getHolder().setFormat(PixelFormat.TRANSLUCENT); drawBubble(); mThread = new Thread(this); } @Override public void surfaceCreated(SurfaceHolder holder) { mThread.start(); //生产冒泡 new Thread(){ public void run() { while(true){ int position = random.nextInt(4); int resId = BitmapIds[position]; mBitmap = BitmapFactory.decodeResource(getResources(),resId); Bitmap bitmap = Bitmap.createScaledBitmap(mBitmap, 50, 50, false); list.add(new BitmapBubble(bitmap, x, y, maxX, maxY)); try { Thread.sleep(500); } catch (InterruptedException e) { e.printStackTrace(); } } }; }.start(); } @Override public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { } @Override public void surfaceDestroyed(SurfaceHolder holder) { mThread.stop(); } public ArrayList<BitmapBubble> getList() { return list; } public void setList(ArrayList<BitmapBubble> list) { this.list = list; } public void drawBubble(){ mBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.ic_launcher); Bitmap bitmap = Bitmap.createScaledBitmap(mBitmap, 40, 40, false); list.add(new BitmapBubble(bitmap, x, y, maxX, maxY)); } } package com.example.mysurfaceviewdemo; import android.content.Context; import android.view.LayoutInflater; import android.view.View; import android.view.View.OnClickListener; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.Button; public class MyAdapter extends BaseAdapter{ Context mContext; public MyAdapter(Context mContext){ this.mContext = mContext; } @Override public int getCount() { return 10; } @Override public Object getItem(int position) { return position; } @Override public long getItemId(int position) { return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { View view = LayoutInflater.from(mContext).inflate(R.layout.activity_main, null); final MySurfaceView mySurfaceView = (MySurfaceView)view.findViewById(R.id.mysurfaceview); Button btn = (Button) view.findViewById(R.id.btn); btn.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { mySurfaceView.drawBubble(); } }); return view; } } package com.example.mysurfaceviewdemo; import android.os.Bundle; import android.app.Activity; import android.view.Menu; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.ListView; public class MainActivity extends Activity { MySurfaceView mySurfaceView; Button btn; ListView listview; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.layout); // setContentView(R.layout.activity_main); // mySurfaceView = (MySurfaceView) findViewById(R.id.mysurfaceview); // btn = (Button) findViewById(R.id.btn); // btn.setOnClickListener(new OnClickListener() { // @Override // public void onClick(View v) { // mySurfaceView.drawBubble(); // } // }); listview = (ListView)findViewById(R.id.listview); listview.setAdapter(new MyAdapter(getApplicationContext())); } } 求大牛教育 ,为什么我在绘制的时候,它的回调不走,但是SurfaceView的宿主是Activity的时候就可以去绘
android做的俄罗斯方块,其他界面在手机撒谎能够看都是正常的,就游戏界面不能满屏
package com.comon; //启动游戏 import java.io.InputStream; import android.content.Context; import android.content.Intent; import android.content.res.Resources; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Canvas; import android.graphics.Paint; import android.util.AttributeSet; import android.view.KeyEvent; import android.view.SurfaceHolder; import android.view.SurfaceView; import android.view.View; public class StarSurfaceView extends SurfaceView implements Runnable,SurfaceHolder.Callback,View.OnKeyListener { //SurfaceHolder用来完成对绘制的画布进行裁剪,控制其大小 SurfaceHolder sHolder=null; Canvas canvas; Paint paint; showPage tm; contro cm; int face; boolean flag; boolean onlyone=true; boolean next = false; Store a; Store c; int x; int y; int kk; // int action; //创建图片对象 Bitmap store1 = null; Bitmap store2 = null; Bitmap store3 = null; Bitmap store4 = null; Bitmap store5 = null; Bitmap store6 = null; Bitmap store7 = null; Bitmap border1 = null; Bitmap border2 = null; Bitmap record = null; Bitmap num0 = null; Bitmap num1 = null; Bitmap num2 = null; Bitmap num3 = null; Bitmap num4 = null; Bitmap num5 = null; Bitmap num6 = null; Bitmap num7 = null; Bitmap num8 = null; Bitmap num9 = null; Bitmap blg = null; // Bitmap fire = null; Bitmap conti=null; Bitmap goon = null; Bitmap good = null; Bitmap happy = null; Bitmap bbk = null; public StarSurfaceView(Context context, AttributeSet attrs) { super(context, attrs); //实例化sHolder sHolder = this.getHolder(); //addCallback:给SurfaceView添加一个回调函数 sHolder.addCallback(this); this.setFocusable(true); // sHolder = this.getHolder(); // sHolder.addCallback(this); paint=new Paint(); tm = new showPage(); cm = new contro(); a = new Store(); c = new Store(); // action=0; face = 0; x=-2; y=4; kk=0; //获得对象 bbk = this.getBitmapById(R.drawable.bbk); blg = this.getBitmapById(R.drawable.tetris); store1 = this.getBitmapById(R.drawable.block0); store2 = this.getBitmapById(R.drawable.block1); store3 = this.getBitmapById(R.drawable.block2); store4 = this.getBitmapById(R.drawable.block3); store5 = this.getBitmapById(R.drawable.block4); store6 = this.getBitmapById(R.drawable.block5); store7 = this.getBitmapById(R.drawable.block6); border1 = this.getBitmapById(R.drawable.border); border2 = this.getBitmapById(R.drawable.border_sm); num0 = this.getBitmapById(R.drawable.a0); num1 = this.getBitmapById(R.drawable.a1); num2 = this.getBitmapById(R.drawable.a2); num3 = this.getBitmapById(R.drawable.a3); num4 = this.getBitmapById(R.drawable.a4); num5 = this.getBitmapById(R.drawable.a5); num6 = this.getBitmapById(R.drawable.a6); num7 = this.getBitmapById(R.drawable.a7); num8 = this.getBitmapById(R.drawable.a8); num9 = this.getBitmapById(R.drawable.a9); record = this.getBitmapById(R.drawable.record); // fire = this.getBitmapById(R.drawable.fire); conti=this.getBitmapById(R.drawable.conti); goon = this.getBitmapById(R.drawable.goon); good = this.getBitmapById(R.drawable.good); happy = this.getBitmapById(R.drawable.happy); } //从资源中装载图片 public Bitmap getBitmapById(int id) { Bitmap image = null; Context currentCtx = this.getContext();//得到当前设备环境 Resources res = currentCtx.getResources();//得到图片资源 InputStream is = res.openRawResource(id);//打开图片资源 image = BitmapFactory.decodeStream(is);//获取图片资源 return image; } //绘制方法 public void draw() { //// Canvas c = null;//声明画布 // c = sHolder.lockCanvas();//锁定画布 //// Paint p;//声明画笔 // p = new Paint(); // // c.drawBitmap(bbk, 0, 0, p); // c.drawBitmap(border1, 2, 1, p);//绘制游戏主背景 // c.drawBitmap(border2, 240, 20, p);//绘制产生下一个方块的背景 // c.drawBitmap(record, 240, 270, p);//绘制计分榜背景 // showFace(c,p); // showC(c,p); // showT(c,p); // showP(c,p); // sHolder.unlockCanvasAndPost(c);//解锁画布 try { canvas= sHolder.lockCanvas(); if (canvas!= null) { canvas.drawBitmap(bbk,0,0,paint); canvas.drawBitmap(border1, 2,1 ,paint); canvas.drawBitmap(border2,240,20, paint); canvas.drawBitmap(record,240, 270,paint); showFace(canvas,paint); showC(canvas,paint); showT(canvas,paint); showP(canvas,paint); // sHolder.unlockCanvasAndPost(c); } } catch (Exception e) { System.out.println("error"); } finally { if (canvas!= null) sHolder.unlockCanvasAndPost(canvas); } } boolean left = false; boolean right = false; boolean up = false; boolean down = false; // boolean back=false; public void run() { if(onlyone){ // int x = -2; // int y = 4; // boolean next = false; // Store a = new Store(); // Store b = new Store(); c.Sttore(-1);//随机为下一个方块区域生成一个方块 a.Sttore(-1);//随机为游戏区域生成一个方块 tm.putS(c);//在下一个方块区域产生一个方块 onlyone=false; // int kk = 0; //用来控制方块的变形次数,在一行内 } while(flag){ if(next) { tm.delS(c);//删除下一个方块区域的方块 a.Sttore(c.kind);//把存储下一个方块区域的方块的数组传递给游戏区域的方块数组 c.Sttore(-1);//为下一个方块区域随机生成一个方块 x = -2; y = 4; next = false; tm.putS(c); } draw();//绘制方块 //控制方块下降速度 try { Thread.sleep(400 - cm.speed); } catch (InterruptedException e) { e.printStackTrace(); } // if(back){ // Intent intent1 = new Intent(); // intent1.setClass( ActivityGame.acGame, TTetris.class); // ActivityGame.acGame.startActivity(intent1); // ActivityGame.acGame.finish(); // break; // } if(left) { tm.delStore(a, x, y);//删除游戏区域的方块 if(tm.leftM(a, x, y)) { y--; //如果方块可以左移,把方块左移 } tm.putStore(a, x, y);//重新生成左移后的方块 left = false; kk++; if(kk < 3) { continue; } } //方块右移 else if(right) { tm.delStore(a, x, y); if(tm.rightM(a, x, y)) { y++; } tm.putStore(a, x, y); right = false; kk++; if(kk < 3) { continue; } } //方块变形 else if(up) { int tv; if( (a.kind+1)%4 == 0) { //每种方块有1,2,3,4这四种状态,如果处于第4种状态,按上就变回第一种状态 tv = a.kind -3; //否则把没按一次上,1变成2,2变成3,3变成4 } else { tv = a.kind + 1; } Store b = new Store(); b.Sttore(tv); tm.delStore(a, x, y); if(tm.fit(b, x, y)) { //如果方块变形后不会碰壁,则生成一个变形后的方块,否则生成原来的方块 a = b; tm.putStore(a, x, y); up = false; kk++; if(kk < 3) { continue; } } else { tm.putStore(a, x, y); up = false; } } else if(down) { tm.delStore(a, x, y); while(tm.fit(a, x, y)) { x++; } tm.putStore(a, x, y); down = false; } tm.delStore(a, x, y); kk = 0; if(tm.fit(a, x, y)) {//使方块下落 x++; tm.putStore(a, x, y); } else { int t; tm.putStore(a, x, y); if(tm.outM(a, x, y)) {//如果方块触顶了,结束游戏,转换到游戏结束界面 Intent intent = new Intent(); intent.setClass( ActivityGame.acGame, ActGameover.class); ActivityGame.acGame.startActivity(intent); ActivityGame.acGame.finish(); break; } t = tm.flood(a, x, y);//消行,并返回消除的行数,不可以消行返回0; // putface(t); face=t; cm.tscore(t); //计分 cm.passWar(); System.out.println(cm.score); tm.pSco(cm.sco); next = true; } } } public void showFace(Canvas canvas,Paint paint) {//通过face控制人物的表情 if(face == 0) { canvas.drawBitmap(goon, 240,120, paint); } else if(face == 1) { canvas.drawBitmap(conti, 240,120, paint); } else if(face == 2||face==3) { canvas.drawBitmap(good, 240,120, paint); } else if(face==4) { canvas.drawBitmap(happy, 240,120, paint); } } // public void putface(int fa) { //生成face的值 // if(fa == 0) { // face = (int)(Math.random()*2); // } // else { // face = fa+1; // } // } public void showC(Canvas canvas,Paint paint) { //绘制分数的图片 for(int i = 0; i <4; i++) { if(tm.co[i] == 0) { canvas.drawBitmap(num0, i*20+240, 330, paint); } else if(tm.co[i] == 1) { canvas.drawBitmap(num1, i*20+240, 330, paint); } else if(tm.co[i] == 2) { canvas.drawBitmap(num2, i*20+240, 330, paint); } else if(tm.co[i] == 3) { canvas.drawBitmap(num3, i*20+240, 330, paint); } else if(tm.co[i] == 4) { canvas.drawBitmap(num4, i*20+240, 330, paint); } else if(tm.co[i] == 5) { canvas.drawBitmap(num5, i*20+240, 330, paint); } else if(tm.co[i] == 6) { canvas.drawBitmap(num6, i*20+240, 330, paint); } else if(tm.co[i] == 7) { canvas.drawBitmap(num7, i*20+240, 330, paint); } else if(tm.co[i] == 8) { canvas.drawBitmap(num8, i*20+240, 330, paint); } else if(tm.co[i] == 9) { canvas.drawBitmap(num9, i*20+240, 330, paint); } } } public void showT(Canvas canvas,Paint paint) {//下一个方块生成区域的方块绘制不同颜色的方块图片 for(int i = 0 ;i < 4; i++) { for(int j = 0; j < 4; j++) { if(tm.brray[i][j] == 1){ canvas.drawBitmap(store1, j*tm.w+240, i*tm.w+20, paint); } else if(tm.brray[i][j] == 2){ canvas.drawBitmap(store2, j*tm.w+240, i*tm.w+20, paint); } else if(tm.brray[i][j] == 3){ canvas.drawBitmap(store3, j*tm.w+240, i*tm.w+20, paint); } else if(tm.brray[i][j] == 4){ canvas.drawBitmap(store4, j*tm.w+240, i*tm.w+20, paint); } else if(tm.brray[i][j] == 5){ canvas.drawBitmap(store5, j*tm.w+240, i*tm.w+20, paint); } else if(tm.brray[i][j] == 6){ canvas.drawBitmap(store6, j*tm.w+240, i*tm.w+20, paint); } else if(tm.brray[i][j] == 7){ canvas.drawBitmap(store7, j*tm.w+240, i*tm.w+20, paint); } } } } public void showP(Canvas canvas,Paint paint) { //为游戏区域的方块绘制不同颜色的图片 for(int i = 0 ;i < tm.array.length; i++){ for(int j = 0; j < tm.array[0].length; j++){ if(tm.array[i][j] == 1){ canvas.drawBitmap(store1, j*tm.w-1, i*tm.w-2, paint); } else if(tm.array[i][j] == 2){ canvas.drawBitmap(store2, j*tm.w-1, i*tm.w-2, paint); } else if(tm.array[i][j] == 3){ canvas.drawBitmap(store3, j*tm.w-1, i*tm.w-2, paint); } else if(tm.array[i][j] == 4){ canvas.drawBitmap(store4, j*tm.w-1, i*tm.w-2, paint); } else if(tm.array[i][j] == 5){ canvas.drawBitmap(store5, j*tm.w-1, i*tm.w-2, paint); } else if(tm.array[i][j] == 6){ canvas.drawBitmap(store6, j*tm.w-1, i*tm.w-2, paint); } else if(tm.array[i][j] == 7){ canvas.drawBitmap(store7, j*tm.w-1, i*tm.w-2, paint); } } } } public boolean onKeyDown(int k, KeyEvent event) { return false; } public boolean onKeyUp(int k,KeyEvent event){ switch (k) { case KeyEvent.KEYCODE_DPAD_UP: up=true; break; case KeyEvent.KEYCODE_DPAD_DOWN: down=true; break; case KeyEvent.KEYCODE_DPAD_LEFT: left=true; break; case KeyEvent.KEYCODE_DPAD_RIGHT: right=true; break; } return false; } public boolean onKey(View v, int k, KeyEvent e) { return false; } public void surfaceChanged(SurfaceHolder holder, int format, int width,int height) { } public void surfaceCreated(SurfaceHolder holder) { flag=true; Thread th = new Thread(this); th.start(); } public void surfaceDestroyed(SurfaceHolder holder) { flag=false; } } main()的代码: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation = "vertical" > <com.comon.StarSurfaceView android:layout_width="fill_parent" android:layout_height="fill_parent" ></com.comon.StarSurfaceView> </LinearLayout>
Android 19 百度InfoWindow 的构造函数的参数是什么?
![图片说明](https://img-ask.csdn.net/upload/201506/14/1434268357_289338.png) API上的三个参数是这样的: public InfoWindow(View view, LatLng position, InfoWindow.OnInfoWindowClickListener listener) 通过传入的 view 构造一个 InfoWindow, 此时只是利用该view生成一个Bitmap绘制在地图中。 参数: view - InfoWindow 展示的 view position - InfoWindow 显示的地理位置 listener - InfoWindow 点击监听者 三个参数的第三个参数现在为什么是int 型的呢? 值又表示什么意思呢? 四个参数的值,中间两个参数表示什么呢? 求大神指教,感激不尽!
Android canvas.drawBitmap()画出来的图片是按dp而不是像素?
写一个连连看的游戏,图片素材是50*50的,手机分辨率1080P,结果用这个方法绘制出来的图片 canvas.drawBitmap(piece.getImage().getImage(),piece.getBeginX(), piece.getBeginY(), null); 是按dp的?因为一排只能放个7、8张。不是说默认操作是按像素的吗?
Android 围棋 求助大神修改一下代码
我这个主活动加上吃子代码运行不了,但是又没有语法错误,请教一下大神们,哪里出现了错误,谢谢啦。 package com.example.gwongsam.zonghenggo; import android.content.Context; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.graphics.Point; import android.os.Bundle; import android.os.Parcelable; import android.util.AttributeSet; import android.view.MotionEvent; import android.view.View; import java.util.ArrayList; /** * 游戏主类 * Created by sam on 2017/12/8. */ public class GameView extends View { //线条数量 private static final int MAX_LINE = 19; //线条的宽度 private int mPanelWidth; //线条的高度 private float mLineHeight; //画笔 private Paint mPaint = new Paint(); //黑棋子 private Bitmap mBlack; //白棋子 private Bitmap mWhite; //比例,棋子的大小是高的四分之三 private float rowSize = 3 * 1.0f / 4; //存储用户点击的坐标 private ArrayList<Point> mWhiteArray = new ArrayList<>(); private ArrayList<Point> mBlackArray = new ArrayList<>(); public GameView(Context context) { super(context); } //标记,是执黑子还是白子 ,白棋先手 private boolean mIsBlack = true; /** * 构造方法 */ public GameView(Context context, AttributeSet attrs) { super(context, attrs); //测试颜色 //setBackgroundColor(0x44ff0000); initPaint(); initBitmap(); } /** * 初始化棋子 */ private void initBitmap() { //拿到图片资源 mBlack = BitmapFactory.decodeResource(getResources(), R.drawable.stone_black); mWhite = BitmapFactory.decodeResource(getResources(), R.drawable.stone_white); } /** * 初始化画笔 */ private void initPaint() { //设置颜色 mPaint.setColor(Color.BLACK); //设置线条宽度 mPaint.setStrokeWidth(3); //抗锯齿 mPaint.setAntiAlias(true); //设置防抖动 mPaint.setDither(true); //设置Style mPaint.setStyle(Paint.Style.STROKE); } /** * 测量 */ @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { //获取高宽值 int widthSize = MeasureSpec.getSize(widthMeasureSpec); int widthMode = MeasureSpec.getMode(widthMeasureSpec); int hightSize = MeasureSpec.getSize(heightMeasureSpec); int hightMode = MeasureSpec.getMode(heightMeasureSpec); //拿到宽和高的最小值,也就是宽 int width = Math.min(widthSize, heightMeasureSpec); //根据测量模式细节处理 if (widthMode == MeasureSpec.UNSPECIFIED) { width = hightSize; } else if (hightMode == MeasureSpec.UNSPECIFIED) { width = widthSize; } //设置这样就是一个正方形了 setMeasuredDimension(width, width); } /** * 测量大小 */ @Override protected void onSizeChanged(int w, int h, int oldw, int oldh) { super.onSizeChanged(w, h, oldw, oldh); //拿到宽 mPanelWidth = w; //分割 mLineHeight = mPanelWidth * 1.0f / MAX_LINE; //棋子宽度 int mWhiteWidth = (int) (mLineHeight * rowSize); //修改棋子大小 mWhite = Bitmap.createScaledBitmap(mWhite, mWhiteWidth, mWhiteWidth, false); mBlack = Bitmap.createScaledBitmap(mBlack, mWhiteWidth, mWhiteWidth, false); } /** * 绘制棋盘的方法 */ private void drawLine(Canvas canvas) { //获取高宽 int w = mPanelWidth; float lineHeight = mLineHeight; //遍历,绘制线条 for (int i = 0; i < MAX_LINE; i++) { //横坐标 int startX = (int) (lineHeight / 2); int endX = (int) (w - lineHeight / 2); //纵坐标 int y = (int) ((0.5 + i) * lineHeight); //绘制横 canvas.drawLine(startX, y, endX, y, mPaint); //绘制纵 canvas.drawLine(y, startX, y, endX, mPaint); } } /** * 绘制棋子的方法 */ private void drawPieces(Canvas canvas) { for (int i = 0; i < mWhiteArray.size(); i++) { //获取白棋子的坐标 Point whitePoint = mWhiteArray.get(i); canvas.drawBitmap(mBlack, (whitePoint.x + (1 - rowSize) / 2) * mLineHeight, (whitePoint.y + (1 - rowSize) / 2) * mLineHeight, null); } for (int i = 0; i < mBlackArray.size(); i++) { //获取黑棋子的坐标 Point blackPoint = mBlackArray.get(i); canvas.drawBitmap(mWhite, (blackPoint.x + (1 - rowSize) / 2) * mLineHeight, (blackPoint.y + (1 - rowSize) / 2) * mLineHeight, null); } } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); drawLine(canvas); drawPieces(canvas); //绘制完成之后判断是否提子 checkGrape(); } /** * 判断是否吃子 */ public void checkGrape(){ int blockLength; int[] block; int[][] map={}; for(int i = 0;i < 19; i++){ for(int j = 0;j < 19; j++){ if(map[i][j] == 0) continue; else{ block = new int[361]; blockLength = 1; block[0] = i*100 + j; recursion(i,j); if(hasQi()) continue; else { for(int t = 0;t < blockLength; t++) map[block[t]/100][block[t]%100] = 0; } } } } } /** * 递归检测块 */ public void recursion(int i,int j){ int blockLength=0; int[] block={}; int[][] map={}; //Left if(i-1 >= 0 && map[i-1][j] == map[i][j] && isInBlock((i-1)*100+j)){ block[blockLength] = (i-1)*100 + j; blockLength++; recursion(i-1,j); } //Up if(j-1 >= 0 && map[i][j-1] == map[i][j] && isInBlock(i*100+j-1)){ block[blockLength] = i*100 + j-1; blockLength++; recursion(i,j-1); } //Right if(i+1 < 19 && map[i+1][j] == map[i][j] && isInBlock((i+1)*100+j)){ block[blockLength] = (i+1)*100 + j; blockLength++; recursion(i+1,j); } //Down if(j+1 < 19 && map[i][j+1] == map[i][j] && isInBlock(i*100+j+1)){ block[blockLength] = i*100 + j+1; blockLength++; recursion(i,j+1); } } /** * 检测块是否有气 */ public boolean hasQi(){ int i,j; int blockLength=0; int[] block={}; int[][] map={}; for(int t = 0;t < blockLength; t++){ i = block[t]/100; j = block[t]%100; if(i-1 >= 0 && map[i-1][j] == 0) return true; if(i+1 < 19 && map[i+1][j] == 0) return true; if(j-1 >= 0 && map[i][j-1] == 0) return true; if(j+1 < 19 && map[i][j+1] == 0) return true; } return false; } /** * 检测是否重复遍历 */ public boolean isInBlock(int neighbor){ int blockLength=0; int[] block={}; for(int i = 0;i < blockLength; i++) { if (block[i] == neighbor) return false; } return true; } /** * 触摸事件 */ @Override public boolean onTouchEvent(MotionEvent event) { switch (event.getAction()) { //按下事件 case MotionEvent.ACTION_DOWN: int x = (int) event.getX(); int y = (int) event.getY(); //封装成一个Point Point p = getValidPoint(x, y); //判断当前这个点是否有棋子了 if (mWhiteArray.contains(p) || mBlackArray.contains(p)) { //点击不生效 return false; } //判断如就存白棋集合,反之则黑棋集合 if (mIsBlack) { mWhiteArray.add(p); } else { mBlackArray.add(p); } //刷新 invalidate(); //改变值 mIsBlack = !mIsBlack; break; } return true; } /** * 不能重复点击 */ private Point getValidPoint(int x, int y) { return new Point((int) (x / mLineHeight), (int) (y / mLineHeight)); } /** * 系统状态 */ private static final String INSTANCE = "instace"; /** * 存储状态 */ @Override protected Parcelable onSaveInstanceState() { Bundle bundle = new Bundle(); bundle.putParcelable(INSTANCE, super.onSaveInstanceState()); return bundle; } /** * 再来一局 */ public void RestartGame() { mWhiteArray.clear(); mBlackArray.clear(); invalidate(); mIsBlack = true; } /** * 悔棋 */ public void Regret() { if (mBlackArray.size() > 0 || mWhiteArray.size() > 0) { if (mIsBlack) { mBlackArray.remove(mBlackArray.size() - 1); mIsBlack = !mIsBlack; } else { mWhiteArray.remove(mWhiteArray.size() - 1); mIsBlack = !mIsBlack; } invalidate(); } } /** * 只下黑棋 */ public void HeiOnly() { mIsBlack = true; } /** * 只下白棋 */ public void BaiOnly() { mIsBlack = false; } } ``` ```
android 自定义view关闭硬件加速之后对于连续按键按下的操作反应好像很迟钝,这是为什么?
今天早上在技术问答里看到一个自定义view,在这个自定义view里边就是调用了canvas.drawBitmap()方法,他用响应按键按下的方法来改变bitmap的绘制位置。我记得以前查过资料,在一些自定义view的一些操作中是不支持硬件加速的。所以我试着去把硬件加速关闭,但是情况来了,程序对按键按下的响应很迟钝,爆出这样的异常:Dropped event because it is stale.有些不明白,即便是关闭了硬件加速也不至于这么迟钝吧?求大神赐教。 这是那个技术问答的链接:http://ask.csdn.net/questions/263461
安卓canvas上如何选中并清除之前画的某一笔画(橡皮功能)
* 使用drawPath(Path,Paint)方法画的,所有Path存放在一个arraylist之中。 * 现在想在onTouchEvent方法中实现橡皮功能,手指触摸选中笔画并清除之。 * 有使用Paint的setStrokeWidth方法,因此画出来的笔画有粗细。 如何判断手指触点坐标是否在形成的笔画图形之内? 最核心问题在于**怎么确定笔画形成的那块区域**? 注:橡皮擦清除整条独立的笔画,类似于Google keep里的绘图那样,不是用背景色绘制触摸轨迹 下面是代码 用于储存path和画笔类型的 fingerPath类: ``` import android.graphics.Path; public class FingerPath { public int color; public boolean emboss; public boolean blur; public int strokeWidth; public Path path; public FingerPath(int color, boolean emboss, boolean blur, int strokeWidth, Path path) { this.color = color; this.emboss = emboss; this.blur = blur; this.strokeWidth = strokeWidth; this.path = path; } } ``` 自定义view类: ``` import android.content.Context; import android.graphics.Bitmap; import android.graphics.BlurMaskFilter; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.EmbossMaskFilter; import android.graphics.MaskFilter; import android.graphics.Paint; import android.graphics.Path; import android.util.AttributeSet; import android.util.DisplayMetrics; import android.view.MotionEvent; import android.view.View; import java.util.ArrayList; public class PaintView extends View { public static int BRUSH_SIZE = 20; public static final int DEFAULT_COLOR = Color.RED; public static final int DEFAULT_BG_COLOR = Color.WHITE; private static final float TOUCH_TOLERANCE = 4; private float mX, mY; private Path mPath; private Paint mPaint; private ArrayList<FingerPath> paths = new ArrayList<>(); private int currentColor; private int backgroundColor = DEFAULT_BG_COLOR; private int strokeWidth; private boolean emboss; private boolean blur; private MaskFilter mEmboss; private MaskFilter mBlur; private Bitmap mBitmap; private Canvas mCanvas; private Paint mBitmapPaint = new Paint(Paint.DITHER_FLAG); public PaintView(Context context) { this(context, null); } public PaintView(Context context, AttributeSet attrs) { super(context, attrs); mPaint = new Paint(); mPaint.setAntiAlias(true); mPaint.setDither(true); mPaint.setColor(DEFAULT_COLOR); mPaint.setStyle(Paint.Style.STROKE); mPaint.setStrokeJoin(Paint.Join.ROUND); mPaint.setStrokeCap(Paint.Cap.ROUND); mPaint.setXfermode(null); mPaint.setAlpha(0xff); mEmboss = new EmbossMaskFilter(new float[] {1, 1, 1}, 0.4f, 6, 3.5f); mBlur = new BlurMaskFilter(5, BlurMaskFilter.Blur.NORMAL); } public void init(DisplayMetrics metrics) { int height = metrics.heightPixels; int width = metrics.widthPixels; mBitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888); mCanvas = new Canvas(mBitmap); currentColor = DEFAULT_COLOR; strokeWidth = BRUSH_SIZE; } public void normal() { emboss = false; blur = false; } public void emboss() { emboss = true; blur = false; } public void blur() { emboss = false; blur = true; } public void clear() { backgroundColor = DEFAULT_BG_COLOR; paths.clear(); normal(); invalidate(); } public void undo() { int size=paths.size(); paths.remove(size-1); invalidate(); } @Override protected void onDraw(Canvas canvas) { canvas.save(); mCanvas.drawColor(backgroundColor); for (FingerPath fp : paths) { mPaint.setColor(fp.color); mPaint.setStrokeWidth(fp.strokeWidth); mPaint.setMaskFilter(null); if (fp.emboss) mPaint.setMaskFilter(mEmboss); else if (fp.blur) mPaint.setMaskFilter(mBlur); mCanvas.drawPath(fp.path, mPaint); } canvas.drawBitmap(mBitmap, 0, 0, mBitmapPaint); canvas.restore(); } private void touchStart(float x, float y) { mPath = new Path(); FingerPath fp = new FingerPath(currentColor, emboss, blur, strokeWidth, mPath); paths.add(fp); mPath.reset(); mPath.moveTo(x, y); mX = x; mY = y; System.out.println("按下时list长度"+paths.size()); } private void touchMove(float x, float y) { float dx = Math.abs(x - mX); float dy = Math.abs(y - mY); if (dx >= TOUCH_TOLERANCE || dy >= TOUCH_TOLERANCE) { mPath.quadTo(mX, mY, (x + mX) / 2, (y + mY) / 2); mX = x; mY = y; } } private void touchUp() { mPath.lineTo(mX, mY); } @Override public boolean onTouchEvent(MotionEvent event) { float x = event.getX(); float y = event.getY(); switch(event.getAction()) { case MotionEvent.ACTION_DOWN : touchStart(x, y); invalidate(); break; case MotionEvent.ACTION_MOVE : touchMove(x, y); invalidate(); break; case MotionEvent.ACTION_UP : touchUp(); invalidate(); break; } return true; } } ```
Kafka实战(三) - Kafka的自我修养与定位
Apache Kafka是消息引擎系统,也是一个分布式流处理平台(Distributed Streaming Platform) Kafka是LinkedIn公司内部孵化的项目。LinkedIn最开始有强烈的数据强实时处理方面的需求,其内部的诸多子系统要执行多种类型的数据处理与分析,主要包括业务系统和应用程序性能监控,以及用户行为数据处理等。 遇到的主要问题: 数据正确性不足 数据的收集主要...
volatile 与 synchronize 详解
Java支持多个线程同时访问一个对象或者对象的成员变量,由于每个线程可以拥有这个变量的拷贝(虽然对象以及成员变量分配的内存是在共享内存中的,但是每个执行的线程还是可以拥有一份拷贝,这样做的目的是加速程序的执行,这是现代多核处理器的一个显著特性),所以程序在执行过程中,一个线程看到的变量并不一定是最新的。 volatile 关键字volatile可以用来修饰字段(成员变量),就是告知程序任何对该变量...
Java学习的正确打开方式
在博主认为,对于入门级学习java的最佳学习方法莫过于视频+博客+书籍+总结,前三者博主将淋漓尽致地挥毫于这篇博客文章中,至于总结在于个人,实际上越到后面你会发现学习的最好方式就是阅读参考官方文档其次就是国内的书籍,博客次之,这又是一个层次了,这里暂时不提后面再谈。博主将为各位入门java保驾护航,各位只管冲鸭!!!上天是公平的,只要不辜负时间,时间自然不会辜负你。 何谓学习?博主所理解的学习,它是一个过程,是一个不断累积、不断沉淀、不断总结、善于传达自己的个人见解以及乐于分享的过程。
程序员必须掌握的核心算法有哪些?
由于我之前一直强调数据结构以及算法学习的重要性,所以就有一些读者经常问我,数据结构与算法应该要学习到哪个程度呢?,说实话,这个问题我不知道要怎么回答你,主要取决于你想学习到哪些程度,不过针对这个问题,我稍微总结一下我学过的算法知识点,以及我觉得值得学习的算法。这些算法与数据结构的学习大多数是零散的,并没有一本把他们全部覆盖的书籍。下面是我觉得值得学习的一些算法以及数据结构,当然,我也会整理一些看过...
有哪些让程序员受益终生的建议
从业五年多,辗转两个大厂,出过书,创过业,从技术小白成长为基层管理,联合几个业内大牛回答下这个问题,希望能帮到大家,记得帮我点赞哦。 敲黑板!!!读了这篇文章,你将知道如何才能进大厂,如何实现财务自由,如何在工作中游刃有余,这篇文章很长,但绝对是精品,记得帮我点赞哦!!!! 一腔肺腑之言,能看进去多少,就看你自己了!!! 目录: 在校生篇: 为什么要尽量进大厂? 如何选择语言及方...
大学四年自学走来,这些私藏的实用工具/学习网站我贡献出来了
大学四年,看课本是不可能一直看课本的了,对于学习,特别是自学,善于搜索网上的一些资源来辅助,还是非常有必要的,下面我就把这几年私藏的各种资源,网站贡献出来给你们。主要有:电子书搜索、实用工具、在线视频学习网站、非视频学习网站、软件下载、面试/求职必备网站。 注意:文中提到的所有资源,文末我都给你整理好了,你们只管拿去,如果觉得不错,转发、分享就是最大的支持了。 一、电子书搜索 对于大部分程序员...
linux系列之常用运维命令整理笔录
本博客记录工作中需要的linux运维命令,大学时候开始接触linux,会一些基本操作,可是都没有整理起来,加上是做开发,不做运维,有些命令忘记了,所以现在整理成博客,当然vi,文件操作等就不介绍了,慢慢积累一些其它拓展的命令,博客不定时更新 free -m 其中:m表示兆,也可以用g,注意都要小写 Men:表示物理内存统计 total:表示物理内存总数(total=used+free) use...
比特币原理详解
一、什么是比特币 比特币是一种电子货币,是一种基于密码学的货币,在2008年11月1日由中本聪发表比特币白皮书,文中提出了一种去中心化的电子记账系统,我们平时的电子现金是银行来记账,因为银行的背后是国家信用。去中心化电子记账系统是参与者共同记账。比特币可以防止主权危机、信用风险。其好处不多做赘述,这一层面介绍的文章很多,本文主要从更深层的技术原理角度进行介绍。 二、问题引入 假设现有4个人...
GitHub开源史上最大规模中文知识图谱
近日,一直致力于知识图谱研究的 OwnThink 平台在 Github 上开源了史上最大规模 1.4 亿中文知识图谱,其中数据是以(实体、属性、值),(实体、关系、实体)混合的形式组织,数据格式采用 csv 格式。 到目前为止,OwnThink 项目开放了对话机器人、知识图谱、语义理解、自然语言处理工具。知识图谱融合了两千五百多万的实体,拥有亿级别的实体属性关系,机器人采用了基于知识图谱的语义感...
程序员接私活怎样防止做完了不给钱?
首先跟大家说明一点,我们做 IT 类的外包开发,是非标品开发,所以很有可能在开发过程中会有这样那样的需求修改,而这种需求修改很容易造成扯皮,进而影响到费用支付,甚至出现做完了项目收不到钱的情况。 那么,怎么保证自己的薪酬安全呢? 我们在开工前,一定要做好一些证据方面的准备(也就是“讨薪”的理论依据),这其中最重要的就是需求文档和验收标准。一定要让需求方提供这两个文档资料作为开发的基础。之后开发...
网页实现一个简单的音乐播放器(大佬别看。(⊙﹏⊙))
今天闲着无事,就想写点东西。然后听了下歌,就打算写个播放器。 于是乎用h5 audio的加上js简单的播放器完工了。 演示地点演示 html代码如下` music 这个年纪 七月的风 音乐 ` 然后就是css`*{ margin: 0; padding: 0; text-decoration: none; list-...
微信支付崩溃了,但是更让马化腾和张小龙崩溃的竟然是……
loonggg读完需要3分钟速读仅需1分钟事件还得还原到昨天晚上,10 月 29 日晚上 20:09-21:14 之间,微信支付发生故障,全国微信支付交易无法正常进行。然...
Python十大装B语法
Python 是一种代表简单思想的语言,其语法相对简单,很容易上手。不过,如果就此小视 Python 语法的精妙和深邃,那就大错特错了。本文精心筛选了最能展现 Python 语法之精妙的十个知识点,并附上详细的实例代码。如能在实战中融会贯通、灵活使用,必将使代码更为精炼、高效,同时也会极大提升代码B格,使之看上去更老练,读起来更优雅。
数据库优化 - SQL优化
以实际SQL入手,带你一步一步走上SQL优化之路!
2019年11月中国大陆编程语言排行榜
2019年11月2日,我统计了某招聘网站,获得有效程序员招聘数据9万条。针对招聘信息,提取编程语言关键字,并统计如下: 编程语言比例 rank pl_ percentage 1 java 33.62% 2 cpp 16.42% 3 c_sharp 12.82% 4 javascript 12.31% 5 python 7.93% 6 go 7.25% 7 p...
通俗易懂地给女朋友讲:线程池的内部原理
餐盘在灯光的照耀下格外晶莹洁白,女朋友拿起红酒杯轻轻地抿了一小口,对我说:“经常听你说线程池,到底线程池到底是个什么原理?”
《奇巧淫技》系列-python!!每天早上八点自动发送天气预报邮件到QQ邮箱
将代码部署服务器,每日早上定时获取到天气数据,并发送到邮箱。 也可以说是一个小型人工智障。 知识可以运用在不同地方,不一定非是天气预报。
经典算法(5)杨辉三角
杨辉三角 是经典算法,这篇博客对它的算法思想进行了讲解,并有完整的代码实现。
英特尔不为人知的 B 面
从 PC 时代至今,众人只知在 CPU、GPU、XPU、制程、工艺等战场中,英特尔在与同行硬件芯片制造商们的竞争中杀出重围,且在不断的成长进化中,成为全球知名的半导体公司。殊不知,在「刚硬」的背后,英特尔「柔性」的软件早已经做到了全方位的支持与支撑,并持续发挥独特的生态价值,推动产业合作共赢。 而对于这一不知人知的 B 面,很多人将其称之为英特尔隐形的翅膀,虽低调,但是影响力却不容小觑。 那么,在...
腾讯算法面试题:64匹马8个跑道需要多少轮才能选出最快的四匹?
昨天,有网友私信我,说去阿里面试,彻底的被打击到了。问了为什么网上大量使用ThreadLocal的源码都会加上private static?他被难住了,因为他从来都没有考虑过这个问题。无独有偶,今天笔者又发现有网友吐槽了一道腾讯的面试题,我们一起来看看。 腾讯算法面试题:64匹马8个跑道需要多少轮才能选出最快的四匹? 在互联网职场论坛,一名程序员发帖求助到。二面腾讯,其中一个算法题:64匹...
面试官:你连RESTful都不知道我怎么敢要你?
干货,2019 RESTful最贱实践
刷了几千道算法题,这些我私藏的刷题网站都在这里了!
遥想当年,机缘巧合入了 ACM 的坑,周边巨擘林立,从此过上了"天天被虐似死狗"的生活… 然而我是谁,我可是死狗中的战斗鸡,智力不够那刷题来凑,开始了夜以继日哼哧哼哧刷题的日子,从此"读题与提交齐飞, AC 与 WA 一色 ",我惊喜的发现被题虐既刺激又有快感,那一刻我泪流满面。这么好的事儿作为一个正直的人绝不能自己独享,经过激烈的颅内斗争,我决定把我私藏的十几个 T 的,阿不,十几个刷题网...
为啥国人偏爱Mybatis,而老外喜欢Hibernate/JPA呢?
关于SQL和ORM的争论,永远都不会终止,我也一直在思考这个问题。昨天又跟群里的小伙伴进行了一番讨论,感触还是有一些,于是就有了今天这篇文。 声明:本文不会下关于Mybatis和JPA两个持久层框架哪个更好这样的结论。只是摆事实,讲道理,所以,请各位看官勿喷。 一、事件起因 关于Mybatis和JPA孰优孰劣的问题,争论已经很多年了。一直也没有结论,毕竟每个人的喜好和习惯是大不相同的。我也看...
白话阿里巴巴Java开发手册高级篇
不久前,阿里巴巴发布了《阿里巴巴Java开发手册》,总结了阿里巴巴内部实际项目开发过程中开发人员应该遵守的研发流程规范,这些流程规范在一定程度上能够保证最终的项目交付质量,通过在时间中总结模式,并推广给广大开发人员,来避免研发人员在实践中容易犯的错误,确保最终在大规模协作的项目中达成既定目标。 无独有偶,笔者去年在公司里负责升级和制定研发流程、设计模板、设计标准、代码标准等规范,并在实际工作中进行...
SQL-小白最佳入门sql查询一
不要偷偷的查询我的个人资料,即使你再喜欢我,也不要这样,真的不好;
项目中的if else太多了,该怎么重构?
介绍 最近跟着公司的大佬开发了一款IM系统,类似QQ和微信哈,就是聊天软件。我们有一部分业务逻辑是这样的 if (msgType = "文本") { // dosomething } else if(msgType = "图片") { // doshomething } else if(msgType = "视频") { // doshomething } else { // doshom...
Nginx 原理和架构
Nginx 是一个免费的,开源的,高性能的 HTTP 服务器和反向代理,以及 IMAP / POP3 代理服务器。Nginx 以其高性能,稳定性,丰富的功能,简单的配置和低资源消耗而闻名。 Nginx 的整体架构 Nginx 里有一个 master 进程和多个 worker 进程。master 进程并不处理网络请求,主要负责调度工作进程:加载配置、启动工作进程及非停升级。worker 进程负责处...
YouTube排名第一的励志英文演讲《Dream(梦想)》
Idon’t know what that dream is that you have, I don't care how disappointing it might have been as you've been working toward that dream,but that dream that you’re holding in your mind, that it’s po...
“狗屁不通文章生成器”登顶GitHub热榜,分分钟写出万字形式主义大作
一、垃圾文字生成器介绍 最近在浏览GitHub的时候,发现了这样一个骨骼清奇的雷人项目,而且热度还特别高。 项目中文名:狗屁不通文章生成器 项目英文名:BullshitGenerator 根据作者的介绍,他是偶尔需要一些中文文字用于GUI开发时测试文本渲染,因此开发了这个废话生成器。但由于生成的废话实在是太过富于哲理,所以最近已经被小伙伴们给玩坏了。 他的文风可能是这样的: 你发现,...
程序员:我终于知道post和get的区别
是一个老生常谈的话题,然而随着不断的学习,对于以前的认识有很多误区,所以还是需要不断地总结的,学而时习之,不亦说乎
相关热词 c#委托 逆变与协变 c#新建一个项目 c#获取dll文件路径 c#子窗体调用主窗体事件 c# 拷贝目录 c# 调用cef 网页填表c#源代码 c#部署端口监听项目、 c#接口中的属性使用方法 c# 昨天
立即提问