我正在开发一款游戏,在这款游戏中,我必须将Canvas上的图像从一个点移动到另一个点,而不仅仅是垂直或水平.
如何以这种方式移动图像?
我有一个5000 x 4000 px图像,我想画在画布上.
首先,我尝试从资源加载它.我把它放进去了/res/drawable.
我使用以下方法:
InputStream input = getResources().openRawResource(R.drawable.huge_image);
Drawable d = Drawable.createFromStream(input, "image");
d.setBounds(...);
d.draw(canvas);
Run Code Online (Sandbox Code Playgroud)
它就像一个魅力.
在这种情况下,InputStream是一个AssetManager.AssetInputStream.
所以现在我想从SD卡加载它.
这是我试图做的事情:
File f = new File(path);
Uri uri = Uri.fromFile(f);
InputStream input = mContext.getContentResolver().openInputStream(uri);
Drawable d = Drawable.createFromStream(input, "image");
Run Code Online (Sandbox Code Playgroud)
在这种情况下InputStream是a FileInputStream,我OutOfMemoryError在创建时得到了Drawable.
所以我想知道:
有没有办法加载图像而不会出现错误?或者有没有办法将a转换FileInputStream为AssetInputStream?
注意:
我不想调整图像大小,因为我正在实现缩放/平移功能.请不要告诉我阅读有效加载大位图.
你可以在这里查看全班.使用时发生错误setImageUri().
这是我的错误日志:
08-13 11:57:54.180: E/AndroidRuntime(23763): FATAL EXCEPTION: main
08-13 11:57:54.180: E/AndroidRuntime(23763): java.lang.OutOfMemoryError: …Run Code Online (Sandbox Code Playgroud) 可能重复:
如何使图像适合android中的圆形框架
我想要一个360度圆形的Image View,我在stackoverflow上找到了相关的解决方案,但它们都在图像视图中产生了圆角.但我想要完整的圆形图像视图.
对于圆角图像视图链接是:
有什么想法吗.
我在我的Android应用程序中实现了三次贝塞尔曲线逻辑.
我在自定义视图的onDraw上在画布上实现了三次贝塞尔曲线代码.
// Path to draw cubic bezier curve
Path cubePath = new Path();
// Move to startPoint(200,200) (P0)
cubePath.moveTo(200,200);
// Cubic to with ControlPoint1(200,100) (C1), ControlPoint2(300,100) (C2) , EndPoint(300,200) (P1)
cubePath.cubicTo(200,100,300,100,300,200);
// Draw on Canvas
canvas.drawPath(cubePath, paint);
Run Code Online (Sandbox Code Playgroud)
我在下面的图像中可视化上面的代码.

[更新]
Logic for selecting first control points, I've taken ,
baseX = 200 , baseY = 200 and curve_size = X of Endpoint - X of Start Point
Start Point : x = baseX and y = baseY
Control Point 1 …Run Code Online (Sandbox Code Playgroud) 我试图从画布上"擦除".就像清理画布的非常简单的测试一样,我实现了以下内容:
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
canvas.drawColor(Color.argb(140, 0, 0, 0));
canvas.drawColor(0, Mode.CLEAR);
}
Run Code Online (Sandbox Code Playgroud)
Color.argb(140, 0, 0, 0)设置此视图被绘制的视图以使其变暗. drawColor(0, Mode.CLEAR)使屏幕完全变黑,而不是删除之前应用的调光. 这个想法来自这里
我有一个Android的绘图应用程序,我目前正在尝试添加一个真正的橡皮擦.在此之前,我刚刚使用白色涂料作为橡皮擦,但现在我不再使用背景颜色和图像了.我通过透明画布下方的图像视图来完成此操作.
我面临的问题是每当我启用我的橡皮擦时,它会在我用手指向下时画出一条坚实的黑色痕迹,但是一旦我释放它就会变成透明的.请参见下面的屏幕截图:
这是我的手指在屏幕上时的样子 - 一条坚实的黑色小道

这是我从屏幕上移开手指后的样子

所以,我似乎越来越接近了,但是当我的手指在擦除时触摸时,我无法找到正确的设置组合以避免黑色痕迹.以下是一些相关的代码片段:
的onDraw
@Override
protected void onDraw(Canvas canvas) {
canvas.drawColor(Color.TRANSPARENT);
canvas.drawBitmap(mBitmap, 0, 0, mBitmapPaint);
canvas.drawPath(mPath, mPaint);
canvas.drawPath(mPreviewPath, mPaint);
}
Run Code Online (Sandbox Code Playgroud)
的onTouchEvent
@Override
public boolean onTouchEvent(MotionEvent event) {
float currentX = event.getX();
float currentY = event.getY();
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
touchStart(currentX, currentY);
invalidate();
break;
case MotionEvent.ACTION_MOVE:
touchMove(currentX, currentY);
invalidate();
break;
case MotionEvent.ACTION_UP:
touchUp(currentX, currentY);
invalidate();
break;
}
return true;
}
Run Code Online (Sandbox Code Playgroud)
当前尝试橡皮擦设置
public void startEraser() {
mPaint.setAlpha(0);
mColor = Color.TRANSPARENT;
mPaint.setColor(Color.TRANSPARENT);
mPaint.setStrokeWidth(mBrushSize);
mPaint.setStyle(Paint.Style.STROKE);
mPaint.setMaskFilter(null);
mPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.CLEAR));
mPaint.setAntiAlias(true); …Run Code Online (Sandbox Code Playgroud) 我有一个GridView5x50内的物品.
我需要向所有方向滚动它们,而不是在到达终点时停止,只是从顶部/左侧开始.
例如从左到右滚动
在滚动之前
1 2 3 4 5
6 7 8 9 10
Run Code Online (Sandbox Code Playgroud)
滚动到右边后
5 1 2 3 4
10 6 7 8 9
Run Code Online (Sandbox Code Playgroud)
从上到下(或从下到上)
在滚动到底部之前
1 2 3 4 5
6 7 8 9 10
11 12 13 14 15
Run Code Online (Sandbox Code Playgroud)
滚动后
6 7 8 9 10
11 12 13 14 15
1 2 3 4 5
Run Code Online (Sandbox Code Playgroud)
我试着让它像GridView原生卷轴一样平滑滚动.
android android-layout android-gridview android-canvas android-view
我试图找出在视图上给定点获取像素颜色值的最佳方法.我有三种方式写入视图:
我用View.setBackgroundDrawable(...)设置了一个背景图像.
我使用Canvas.drawText(...),Canvas.drawLine(...)等将文本,绘制线等写入支持Bitmap的Canvas.
我通过将子对象(sprite)写入传递给View的onDraw(Canvas画布)方法的Canvas来绘制子对象(精灵).
这是我的类中的onDraw()方法,它扩展了View:
@Override
public void onDraw(Canvas canvas) {
// 1. Redraw the background image.
super.onDraw(canvas);
// 2. Redraw any text, lines, etc.
canvas.drawBitmap(bitmap, 0, 0, null);
// 3. Redraw the sprites.
for (Sprite sprite : sprites) {
sprite.onDraw(canvas);
}
}
Run Code Online (Sandbox Code Playgroud)
获得像素的颜色值以考虑所有这些来源的最佳方法是什么?
我是一个相当"新手"的Android开发人员,我希望我的第一个项目之一是一个动态壁纸,但是我是否应该关注Canvas或OpenGL是否存在冲突.作为新手,我知道我应该首先掌握Canvas,因为它更容易使用,但我更喜欢从我感兴趣的现实世界项目中学习,即使它有时有点倒退.
我之前以非常基本的方式使用过这两种方式,并且我理解它们的一般概念,但我不确定它们如何转移到动态壁纸的领域.我认为在动态壁纸上不需要OpenGL的全速运行,因为以最大FPS运行它会比电池耗尽更多,但与此同时我担心使用Canvas会导致滞后和在做更换主屏幕等事情时会口吃.
我一直倾向于使用OpenGL ES 2.0,以保持性能最佳,因为我对壁纸的初步想法涉及很多分层,我不确定Canvas是否有能力,但我希望更有经验的开发人员对是否有意见或者不是所有涉及使用OpenGL的额外工作(特别是与我看过的动态壁纸有关)是值得的.
我一直在Android上进行PDF打印工作时遇到麻烦.我要做的是在WebView中渲染一些HTML,然后在PDF画布上绘制WebView内容,最后将PDF写入文件.我遇到的问题是,当我绘制到PDF画布时,即使有足够的画布,内容也会被剪裁.我已经尝试使用这种工具来调整画布大小,.clipRect(Rect rect, Op op)但这种工作并不像我喜欢的那样好.
我也不知道如何将HTML px测量值可靠地转换为PDF PostScript 1/72英寸测量值.
这是我正在使用的代码:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
WebView wv = (WebView) this.findViewById(R.id.webView1);
wv.loadUrl("file:///android_asset/temp.html");
}
public void button1onClick(View v)
{
//Create PDF document
PdfDocument doc = new PdfDocument();
//Create A4 sized PDF page
PageInfo pageInfo = new PageInfo.Builder(595,842,1).create();
Page page = doc.startPage(pageInfo);
WebView wv = (WebView) this.findViewById(R.id.webView1);
page.getCanvas().setDensity(200);
//Draw the webview to the canvas
wv.draw(page.getCanvas());
doc.finishPage(page);
try
{
//Create the PDF file
File root = Environment.getExternalStorageDirectory();
File file = …Run Code Online (Sandbox Code Playgroud)