我正在使用Canvas创建绘图应用程序的 android 类。这是我第一次尝试使用 Canvas 类。到目前为止,我使用的代码工作正常,绘图工作正常。但我在这段代码中意识到,它允许用户仅用一根手指进行绘画,我的意思是说,如果用户使用多于一根手指在画布上绘画,则不允许用户用多根手指进行绘画。我浏览了有关多个触摸事件的文档,但未能在我的代码中实现它。那么有人可以帮我解决这个问题吗?
我用于在画布上绘图的代码:
public class DrawView extends View implements OnTouchListener
{
private Canvas m_Canvas;
private Path m_Path;
private Paint m_Paint;
ArrayList<Pair<Path, Paint>> arrayListPaths = new ArrayList<Pair<Path, Paint>>();
ArrayList<Pair<Path, Paint>> undonePaths = new ArrayList<Pair<Path, Paint>>();
private float mX, mY;
private Bitmap bitmapToCanvas;
private static final float TOUCH_TOLERANCE = 4;
public DrawView(Context context)
{
super(context);
setFocusable(true);
setFocusableInTouchMode(true);
this.setOnTouchListener(this);
onCanvasInitialization();
}
public void onCanvasInitialization()
{
m_Paint = new Paint();
m_Paint.setAntiAlias(true);
m_Paint.setDither(true);
m_Paint.setColor(Color.parseColor("#37A1D1"));
m_Paint.setStyle(Paint.Style.STROKE);
m_Paint.setStrokeJoin(Paint.Join.ROUND);
m_Paint.setStrokeCap(Paint.Cap.ROUND);
m_Paint.setStrokeWidth(2);
m_Path = …Run Code Online (Sandbox Code Playgroud) 我需要一些矩阵运算方面的帮助。我想要实现的是:
我的代码目前如下所示:
Matrix matrix = new Matrix();
matrix.preRotate(mShip.getRotation(), mShip.getX() + mShip.getCurrentBitmap().getWidth()/2f, mShip.getY() + mShip.getCurrentBitmap().getHeight()/2f);
matrix.setScale((1.0f * mShip.getWidth() / mShip.getCurrentBitmap().getWidth()), (1.0f * mShip.getHeight() / mShip.getCurrentBitmap().getHeight()));
matrix.postTranslate(mShip.getX(), mShip.getY());
mCanvas.drawBitmap(mShip.getCurrentBitmap(), matrix, mBasicPaint);
Run Code Online (Sandbox Code Playgroud)
但是旋转的中心错误,我不知道如何解决这个问题 - 我已经环顾四周,但只发现了类似的问题,没有解决方案。我认为我可能必须将其中一个操作应用于另一个操作的值,因为它们是按顺序执行的,但我不知道如何操作。
从事咨询项目。最后一分钟的要求是球在屏幕上弹跳(不要问为什么......叹息)
不管怎样......这些球是按值分组的。10 个红球价值 100 分。5 个球为蓝色,价值 50 分。5 个绿色球价值 25 分。5 个球为黄色,得 10 分。
在此背景下,我采取的方法是扩展 SurfaceView 并定义 5 个线程,每个线程管理一组特定的球。
每个线程从 SurfaceView 接收相同的 SurfaceHolder。
我选择多线程而不是单线程的原因是管理屏幕上所有球的性能并不是最好的。
OpenGL 目前还不是一个真正的选择。
这是线程类之一的示例。当线程运行时,它会创建一定数量的球。每个球都是随机创建并添加到列表中的。
public class hundred_balls_thread extends base_balls_thread {
public hundred_balls_thread(SurfaceHolder holder, Context ctext, int radius) {
super(holder, ctext, radius);
}
@Override
public void run() {
int x, y, radius;
while (Calorie_balls.size() <= 21) {
x = 100 + (int) (Math.random() * (mCanvasWidth - 200));
y = 100 + (int) (Math.random() * (mCanvasHeight) - …Run Code Online (Sandbox Code Playgroud) 我正在开发一个与Google地图相关的应用程序.我是谷歌地图的初学者.
我想做一个在我当前位置显示Pin的应用程序.当我点击该引脚时,它会显示包含我当前地址的对话框."Pin是可移动的".当我在Google地图上将图钉从一个位置移动到另一个位置时,对话框会显示该位置的地址.
所以请给我想法或参考网站.
在我的Android绘图应用程序中,我将在画布上绘画.但有些时候我在画之前就有了Image.那时我的油漆变慢了.问题出在哪儿 ??
仅在Canvas上绘制的代码:
@Override
protected void onDraw(Canvas canvas) {
//canvas.drawColor(0, PorterDuff.Mode.CLEAR);
// set the Canvas Color
canvas.drawColor(canvasColor); // edited
canvas.drawBitmap(mBitmap, 0, 0, mBitmapPaint);
canvas.drawPath(mPath, mPaint);
}
Run Code Online (Sandbox Code Playgroud)
将图像作为背景的代码是:
@Override
protected void onDraw(Canvas canvas) {
//canvas.drawColor(0, PorterDuff.Mode.CLEAR);
// set the Canvas Color
canvas.drawColor(canvasColor); // edited
if(!(imagePath==null))
{
Bitmap tempBitmap = BitmapFactory.decodeFile(imagePath); // from the gallery
photoBitmap = Bitmap.createScaledBitmap(tempBitmap, display.getWidth(), display.getHeight(), true);
}
if(!(imagePath==null))
{
canvas.drawBitmap (photoBitmap,0, 0, null);
}
canvas.drawBitmap(mBitmap, 0, 0, mBitmapPaint);
canvas.drawPath(mPath, mPaint);
}
Run Code Online (Sandbox Code Playgroud)
现在我不知道为什么我的油漆变得很慢,而我在画布上画画,如果有图像作为背景.请帮帮我.谢谢.
我目前正在制作一个密集的LiveWallpaper,它绘制到画布上.我发生了以下视频:http://www.youtube.com/watch?v = v9S5EO7CLjo.
但是,当我尝试实现硬件加速时,我遇到了错误.这是我的代码:
if (c != null && mStaticRects.length > 10 && c.isHardwareAccelerated())
drawSurfacePortrait(c);
if (c != null && mStaticRects.length < 20 && c.isHardwareAccelerated())
drawSurfaceLandscape(c);
Run Code Online (Sandbox Code Playgroud)
当我运行它时,这是相应的错误:
AndroidRuntime(382): java.lang.NoSuchMethodError: android.graphics.Canvas.isHardwareAccelerated
Run Code Online (Sandbox Code Playgroud)
最后这是我的清单......
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="stuff.of.mine"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk android:minSdkVersion="7" android:targetSdkVersion="15" />
<uses-permission android:name="android.permission.VIBRATE" ></uses-permission>
<uses-feature
android:name="android.software.live_wallpaper"
android:required="true" />
<application
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
***android:hardwareAccelerated="true"***>
<service
android:name=".SomeWPService"
android:permission="android.permission.BIND_WALLPAPER"
***android:hardwareAccelerated="true"***>
<intent-filter>
<action android:name="android.service.wallpaper.WallpaperService" />
</intent-filter>
<meta-data
android:name="android.service.wallpaper"
android:resource="@xml/mylwp" />
</service>
</application>
Run Code Online (Sandbox Code Playgroud)
我在SO上使用了(看过)很多例子,我需要的是在布局上的两个图像视图之间绘制一条线:

我看到的所有示例或示例,只是使用视图扩展类,并将该类设置为ContentView As,
public class DrawView extends View {
Paint paint = new Paint();
public DrawView(Context context) {
super(context);
paint.setColor(Color.BLACK);
}
@Override
public void onDraw(Canvas canvas) {
canvas.drawLine(0, 50, 350, 50, paint);
}
}
Run Code Online (Sandbox Code Playgroud)
和,...
@Override
public void onCreate(final Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
DrawView drawView = new DrawView(this);
setContentView(drawView);
}
Run Code Online (Sandbox Code Playgroud)
实际上,这是一个很好的方法但是如何将这些图像添加到画布(或)如何加载我的布局(XML文件)以在它们之间绘制线条.
任何类型的小推动也对我的工作有很大的帮助.谢谢.
我想用Android来绘制这样的渐变Canvas:
在水平方向上有两种颜色(红色和蓝色)的渐变.然后在垂直方向上有一个透明度梯度(允许红色和蓝色显示)为空(没有所有颜色?).
我在这里发现了这个链接,这与我想要的很接近.但我无法弄清楚如何使底部透明.
如何在Android中实现这一目标?
我正在尝试使用Canvas更改形状和文本交叉的颜色.
我有2种形状和1种不同颜色的文字.
这没有任何PorterDuffXfermode,并且PorterDuffColorFilter模式添加到任何油漆.我希望交叉的形状是特定的颜色,例如白色,文本红色或白色,如下图所示.
在我的例子中,文本位于底部,圆圈中间和矩形上方,但它是无关紧要的,我只是想弄清楚它是如何工作的,以及如何将交叉点设置为特定的颜色.
正如您在此图片中看到的那样
背景是黑色,圆圈是白色,文字是黑色.当圆圈重叠时,圆圈的交点变为黑色,文本的重叠部分变为白色.
我可以实现这个目标
canvas.drawColor(Color.TRANSPARENT, Mode.CLEAR);
paint.setXfermode(new PorterDuffXfermode(Mode.SRC_OUT));
Run Code Online (Sandbox Code Playgroud)
如果圆形和矩形都是白色而背景是黑色.当我将背景颜色更改为任何其他颜色时,文本不可见,形状为黑色.
android ×10
android-canvas ×10
android-maps ×1
hardware ×1
java ×1
kotlin ×1
line ×1
matrix ×1
multi-touch ×1
ondraw ×1
paint ×1
surfaceview ×1