不少android游戏使用摩讯截图都截出一块黑的图片。
下面解决截图黑屏的问题:
情况一:
图通过Canvas 画在Bitmap 上,再把bitmap放入ImageView中。(这种做游戏的方式很少)
代码如下:
写道
package com.czq.test;
import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Path;
import android.graphics.Path.Direction;
import android.graphics.Typeface;
import android.os.Bundle;
import android.view.Display;
import android.view.MotionEvent;
import android.view.Window;
import android.view.WindowManager;
import android.widget.ImageView;
import com.mobcent.snapshot.share.android.helper.MCShareSnapshotHelper;
public class HelloGraphicsActivity extends Activity {
ImageView img;
Canvas canvas;
Bitmap bitmap;
Paint paint;
int width;
int height;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// 设置全屏,也可以在xml中进行设置 。
requestWindowFeature(Window.FEATURE_NO_TITLE);
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
setContentView(R.layout.graphics_activity);
img = (ImageView) findViewById(R.id.img);
// 得到屏幕的宽和高。
Display display = getWindowManager().getDefaultDisplay();
width = display.getWidth();
height = display.getHeight();
// 创建图片,用来绘制。
bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
// 创建画布,并且设置图片用来进行绘制。一个画布可以看成是整个屏幕。
canvas = new Canvas();
canvas.setBitmap(bitmap);
// 设置画笔,的各种属性。
// 可以利用typeface设置外部字体
paint = new Paint();
paint.setAntiAlias(true);
paint.setColor(Color.RED);
paint.setStrokeWidth(10);
paint.setStyle(Paint.Style.FILL);
// 利用画布直接将内容绘制到bitmap上面。
canvas.drawCircle(50, 50, 30, paint);
// 设定字体和各种格式
Typeface typeface = Typeface.create("test", Typeface.BOLD_ITALIC);
paint.setTypeface(typeface);
paint.setTextSize(25);
canvas.drawText("我是被画出来的!", 100, 50, paint);
// 画线
paint.setColor(Color.GREEN);
canvas.drawLine(0, 0, width, height / 2, paint);
// 画一条路径;Path.moveTo
Path path = new Path();
paint.setColor(Color.BLUE);
// 移动动位置
path.moveTo(150, 150);
// 画线条
path.lineTo(150, 200);
path.lineTo(200, 210);
path.lineTo(30, 30);
canvas.drawPath(path, paint);
// 从哪里开始画一个弧形
path.reset();
path.addCircle(230, 230, 10, Direction.CCW);
canvas.drawPath(path, paint);
// 将画好的图片显示到屏幕上面。
img.setImageBitmap(bitmap);
// 清空笔刷;
paint.reset();
}
@Override
public boolean onTouchEvent(MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_DOWN) {
//截图
MCShareSnapshotHelper.takeSnapshot(HelloGraphicsActivity.this, "", "");
} else if (event.getAction() == MotionEvent.ACTION_UP) {
} else if (event.getAction() == MotionEvent.ACTION_MOVE) {
}
return true;
}
}
情况二:
继承View 把图画在View上(这种情况也用的不多)
代码如下:
写道
package com.czq.test;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Path;
import android.graphics.Path.Direction;
import android.graphics.Typeface;
import android.view.View;
public class MyView extends View {
Canvas bitcanvas;
Bitmap bitmap;
Paint paint;
int width;
int height;
public MyView(Context context) {
super(context);
}
@Override
public void draw(Canvas canvas) {
super.draw(canvas);
// 创建图片,用来绘制。
width = 320;
height = 480;
bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
// 创建画布,并且设置图片用来进行绘制。一个画布可以看成是整个屏幕。
bitcanvas = new Canvas();
// 在画布上 设置Bitmap
bitcanvas.setBitmap(bitmap);
// 设置画笔,的各种属性。
// 可以利用typeface设置外部字体
paint = new Paint();
paint.setAntiAlias(true);
paint.setColor(Color.RED);
paint.setStrokeWidth(10);
paint.setStyle(Paint.Style.FILL);
// 利用画布直接将内容绘制到bitmap上面。
bitcanvas.drawCircle(50, 50, 30, paint);
// 设定字体和各种格式
Typeface typeface = Typeface.create("test", Typeface.BOLD_ITALIC);
paint.setTypeface(typeface);
paint.setTextSize(25);
bitcanvas.drawText("我是被画出来的!", 100, 50, paint);
// 画线
paint.setColor(Color.GREEN);
bitcanvas.drawLine(0, 0, width, height / 2, paint);
// 画一条路径;Path.moveTo
Path path = new Path();
paint.setColor(Color.BLUE);
// 移动动位置
path.moveTo(150, 150);
// 画线条
path.lineTo(150, 200);
path.lineTo(200, 210);
path.lineTo(30, 30);
bitcanvas.drawPath(path, paint);
// 从哪里开始画一个弧形
path.reset();
path.addCircle(230, 230, 10, Direction.CCW);
bitcanvas.drawPath(path, paint);
// 将画好的图片显示到屏幕上面。
// 清空笔刷;
canvas.drawBitmap(bitmap, 0, 0, paint);
paint.reset();
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
/*
* width = 320; height = 480; bitmap = Bitmap.createBitmap(width,
* height, Bitmap.Config.ARGB_8888); canvas.setBitmap(bitmap);
*/
// canvas.drawBitmap(bitmap, 0, 0, paint);
}
}
package com.czq.test;
import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.os.Bundle;
import android.view.MotionEvent;
import android.view.Window;
import android.view.WindowManager;
import com.mobcent.snapshot.share.android.helper.MCShareSnapshotHelper;
public class ViewActivity extends Activity{
Canvas canvas;
Bitmap bitmap;
Paint paint;
int width;
int height;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// 设置全屏,也可以在xml中进行设置 。
requestWindowFeature(Window.FEATURE_NO_TITLE);
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
setContentView(new MyView(this));
}
@Override
public boolean onTouchEvent(MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_DOWN) {
//截图
MCShareSnapshotHelper.takeSnapshot(ViewActivity.this, "", "");
} else if (event.getAction() == MotionEvent.ACTION_UP) {
} else if (event.getAction() == MotionEvent.ACTION_MOVE) {
}
return true;
}
}
情况三: 把图画在自定义的SurfaceView 上(这种情况比较常见,目前大多数android游戏都是这样做)
代码如下:
写道
package com.czq.test;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Bitmap.Config;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.view.SurfaceHolder;
import android.view.SurfaceHolder.Callback;
import android.view.SurfaceView;
import android.view.animation.Animation;
public class MySurfaceView extends SurfaceView implements Callback, Runnable {// 备注1
private SurfaceHolder sfh;
private Thread th;
private Canvas canvas;
private Paint paint;
private int ScreenW, ScreenH;
private Bitmap mbmpTest;
public MySurfaceView(Context context) {
super(context);
th = new Thread(this);
sfh = this.getHolder();
sfh.addCallback(this); // 备注1
paint = new Paint();
paint.setAntiAlias(true);
paint.setColor(Color.RED);
this.setKeepScreenOn(true);// 保持屏幕常亮
}
@Override
public void startAnimation(Animation animation) {
super.startAnimation(animation);
}
public void surfaceCreated(SurfaceHolder holder) {
ScreenW = this.getWidth();// 备注2
ScreenH = this.getHeight();
// 创建 画布上的bitmap
mbmpTest = Bitmap.createBitmap(ScreenW, ScreenH, Config.RGB_565);
th.start();
}
private void draw() {
try {
Canvas bitCanvas = new Canvas(mbmpTest); //先把图画在bitmap上
bitCanvas.drawColor(Color.WHITE);
bitCanvas.drawText("hello", 100, 100, paint);
bitCanvas.drawText("这就是简单的一个游戏框架", 100, 130, paint);
canvas = sfh.lockCanvas();
canvas.drawBitmap(mbmpTest, 0, 0, paint); // 再把bitmap 画在当前view的canvas上
} catch (Exception ex) {
} finally { // 备注3
if (canvas != null)
sfh.unlockCanvasAndPost(canvas); // 将画好的画布提交
}
}
public void run() {
while (true) {
draw();
try {
Thread.sleep(100);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
}
public void surfaceDestroyed(SurfaceHolder holder) {
// TODO Auto-generated method stub
}
public Bitmap getMbmpTest() {
return mbmpTest;
}
public void setMbmpTest(Bitmap mbmpTest) {
this.mbmpTest = mbmpTest;
}
}
截图方法:
写道
import android.app.Activity;
import android.os.Bundle;
import android.view.MotionEvent;
import android.view.Window;
import android.view.WindowManager;
import com.mobcent.snapshot.share.android.helper.MCShareSnapshotHelper;
public class SurfaceActivity extends Activity {
/** Called when the activity is first created. */
private MySurfaceView view;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
this.requestWindowFeature(Window.FEATURE_NO_TITLE);
view=new MySurfaceView(this);
setContentView(view);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_DOWN) {
MCShareSnapshotHelper.takeSnapshotWithBitmap(SurfaceActivity.this, view.getMbmpTest(), "", "");
} else if (event.getAction() == MotionEvent.ACTION_UP) {
} else if (event.getAction() == MotionEvent.ACTION_MOVE) {
}
return true;
}
}
分享到:
相关推荐
在Android应用开发过程中,有时我们需要实现屏幕截图的功能,例如在社交应用中分享当前界面的画面,或者在游戏应用中保存精彩瞬间等场景。本文将详细介绍如何在Android应用中实现屏幕截图功能。 #### 二、核心逻辑...
《Android游戏源码安卓单机3D赛车游戏项目》是一个专为Android平台设计的3D赛车游戏开发资源,它提供了一整套完整的源代码,帮助开发者深入理解Android游戏开发技术,特别是3D图形渲染和物理引擎的应用。在这个项目...
这份“Android游戏编程ppt”提供了一套详尽的教程,帮助开发者深入理解和掌握Android游戏开发的核心概念。以下是对该PPT内容的详细解读: 1. **Android环境搭建**:首先,开发者需要安装并配置Android Studio,这是...
"基于Android"表明游戏是针对Android操作系统设计的,适用于各种Android设备。"成语PK游戏"则说明游戏的核心玩法是通过成语比拼来竞争,可能涉及到成语的记忆、理解和运用。"源码 + 演示视频"这部分表示提供的是游戏...
"安卓"标签明确了这个项目是针对Android操作系统,这是由Google开发的开源移动操作系统,广泛应用于智能手机和平板电脑。这提示我们,源代码将使用Java或Kotlin等Android开发语言编写,并遵循Android SDK(软件开发...
该资源是一个针对Android平台的游戏分享客户端的源代码,主要编程语言为Java,并涉及到Apache相关技术。这个源码可能包含了实现游戏分享功能的各种组件和模块,是开发者学习Android应用开发,尤其是游戏分享功能的一...
《Android游戏:像素鸟》是一款深受玩家喜爱的休闲游戏,其独特的玩法和简洁的画面风格在全球范围内引发了热潮。作为Android平台上的经典之作,像素鸟(Flappy Bird)以其简单易上手的操作和高难度挑战,成为了许多...
ShareREC SDK提供了方便的接口,允许开发者将游戏内的精彩瞬间截图并分享到用户的社交网络。 首先,我们需要理解Unity3dDemo这个压缩包中的内容。Unity3dDemo很可能是一个包含了示例代码和资源的项目,用于演示如何...
1. **Himi之Android游戏开发系列**:这本书可能包含了Himi的个人经验分享和实战案例,通常会深入浅出地讲解如何在Android平台上构建游戏。可能涵盖的主题包括使用Android SDK、游戏框架的选择(如Unity、Cocos2d-x或...
5. 重复信息的特殊含义:文档中重复出现的访问稀酷客网站的请求,可能是为了强调该网站在Android游戏开发领域的重要性,以及提供该网站地址以方便读者进行资源的获取和知识的分享。 6. 对初学者的提示:虽然本书...
虽然没有完整的章节列表,但我们可以推测这些章节可能覆盖了Android游戏开发的关键概念和技巧: 1. **第5章**:通常涉及基础编程和Android SDK的介绍,可能包括Android Studio的使用、布局设计、活动(Activity)...
该资源是一个针对Android平台的手机游戏分享客户端的源码,非常适合计算机科学专业的学生进行毕业设计学习。这个项目可能涵盖了Android应用程序开发的多个重要知识点,包括界面设计、数据存储、网络通信以及用户交互...
本文将深入探讨这个项目中的关键知识点,为Android游戏开发爱好者提供学习参考。 1. **游戏框架**:游戏的基础架构通常是自定义的游戏循环,这在Android中通常表现为`SurfaceView`或`GLSurfaceView`的继承。在这个...
《Android 2.0 游戏开发实战宝典》是一本深入探讨Android游戏开发的专著,特别针对Android 2.0版本进行了详尽的解析。这本书不仅包含了丰富的理论知识,还提供了完整的章节源码,使得读者能够在实践中学习并掌握游戏...
《ANDROID_2.0游戏开发实战宝典.pdf》是一份针对Android平台游戏开发的专业资料,这份资料的分享表明了在IT领域,特别是游戏开发行业内,对于高质量资源的渴求与共享精神的存在。以下是对这份资料可能包含的关键知识...
《基于Android的移动应用手机游戏分享客户端源码详解》 在当今移动互联网时代,Android作为全球最广泛使用的智能手机操作系统之一,其应用开发领域备受关注。本篇将详细解析一款基于Android平台的移动应用手机游戏...
### Android游戏开发入门知识点 #### 一、章节概述与学习目标 在《Android游戏开发入门》这本书中,作者Mario Zechner将引导读者通过十四章的内容深入理解Android平台上的游戏开发技术。本书不仅适合初学者,也适用...
《Android游戏源码详解:安卓美女拼图游戏第二版》 在移动开发领域,Android平台因其开源特性,吸引了大量开发者进行应用与游戏的创新。本资料聚焦于一款名为“安卓美女拼图游戏第二版”的Android游戏源码,旨在...