通常我看到的样本,在尝试在画布上绘制位图时使用此方法.例如:
paint.setAntiAlias(true);
paint.setFilterBitmap(true);
paint.setDither(true);
Run Code Online (Sandbox Code Playgroud)
但我不知道这三种方法是做什么的?当我必须使用它们时?
我正在使用我自己的https://github.com/mdg-iitr/RotatingText版本来显示旋转文本小部件。此 GitHub 中提供了一个视频,可让您观看动画。这个想法是设置单词行。行是一行接一行地显示的。整行都在旋转(它的话也是如此)。当前一行的旋转动画结束时,会在前一行之后显示一行。
我使用 aDynamicLayout来显示文本行。请记住:行必须旋转。
我的问题是:显然,我不能使用该方法canvas.drawTextOnPath(dynamicLayoutObject)。所以,我做的是:dynamicLayoutObjec.draw(canvas);。但那时没有任何动画。事实上,文本(所以DynamicLayout包含它)必须旋转。
的DynamicLayout(事实上,它的文本)必须动画(旋转)。旋转可以在这个 SO 问题(https://github.com/mdg-iitr/RotatingText)开头给出的 Github 原始存储库的插图中找到。
我不知道如何让我的DynamicLayout(和/或其文本)沿着我的路径旋转。
我大约在 8 个月前修改了原始 RotatingText 库。为了简化它(更少的类,更少的方法,没有未使用的方法等)。事实上,我只有两个类:
RotatingTextSwitcher,这是 XML 小部件
And Rotatable,其中包含要旋转的字符串数组。
包含 XML 小部件的 .XML 布局RotatingTextSwitcher以对其进行测试
AFragment膨胀前面提到的布局,设置每个旋转行的单词,并显示它们。
为了测试它,创建一个显示下面给出的片段的活动,它反过来使用上面提供的其他来源。
import android.graphics.Path;
import android.view.animation.Interpolator;
public class Rotatable {
private final String[] text;
private final int update_duration;
private int animation_duration;
private Path path_in, path_out;
private …Run Code Online (Sandbox Code Playgroud) android android-widget android-layout android-canvas android-view
是否可以使用一种drawCircle方法在Android的画布上绘制一个具有不同颜色边框的圆圈?
我注意到了FILL_AND_STROKE的PaintStyle,但是填充和边框似乎都没有不同的颜色.
我真的不想要调用两个drawCircle方法.
我想学习如何在我的Android应用程序中创建图层(如在photoshop中).我想实现一个基本的东西:当我在画布中添加一个图像时,例如,我想要能够绘制画布,但画面不能影响图形的线条.然后我需要将该图像保存在我的SD卡上.
有什么建议/意见/例子吗?我可以用什么来实现这个目标?
我在我的项目中使用来自https://github.com/lvillani/android-cropimage的图像裁剪库来裁剪存储在设备上的图像.
但是,某些用户使用以下堆栈跟踪报告崩溃
java.lang.UnsupportedOperationException
at android.view.GLES20Canvas.clipPath(GLES20Canvas.java:413)
at com.android.camera.HighlightView.draw(HighlightView.java:101)
at com.android.camera.CropImageView.onDraw(CropImage.java:783)
at android.view.View.draw(View.java:11006)
at android.view.View.getDisplayList(View.java:10445)
at android.view.ViewGroup.drawChild(ViewGroup.java:2850)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2489)
at android.view.View.getDisplayList(View.java:10443)
at android.view.ViewGroup.drawChild(ViewGroup.java:2850)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2489)
at android.view.View.getDisplayList(View.java:10443)
at android.view.ViewGroup.drawChild(ViewGroup.java:2850)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2489)
at android.view.View.getDisplayList(View.java:10443)
at android.view.ViewGroup.drawChild(ViewGroup.java:2850)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2489)
at android.view.View.getDisplayList(View.java:10443)
at android.view.ViewGroup.drawChild(ViewGroup.java:2850)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2489)
at android.view.View.draw(View.java:11009)
at android.widget.FrameLayout.draw(FrameLayout.java:450)
at com.android.internal.policy.impl.PhoneWindow$DecorView.draw(PhoneWindow.java:2154)
at android.view.View.getDisplayList(View.java:10445)
at android.view.HardwareRenderer$GlRenderer.draw(HardwareRenderer.java:853)
at android.view.ViewRootImpl.draw(ViewRootImpl.java:1961)
at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1679)
at android.view.ViewRootImpl.handleMessage(ViewRootImpl.java:2558)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:4697)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:787)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:554)
at dalvik.system.NativeStart.main(Native Method)
Run Code Online (Sandbox Code Playgroud)
从搜索我认为它只是由某些设备上的硬件加速引起的.我在清单中禁用了硬件加速,但异常仍在发生.我还发现"一个可靠的解决方法是识别代码中有问题的操作,将其绘制到位图中,然后将位图blit到加速画布."
根据堆栈跟踪的有问题的代码是
protected …Run Code Online (Sandbox Code Playgroud) 尝试在单个画布上绘制每个ms的内容.我的意思是只向画布添加细节,而不是每一帧都重绘它.所以这段代码给了我三个不同的画布.第三,然后再次.为什么?
public void run() {
this.run = true;
Canvas canvas = null;
while (run) {
try {
canvas = this.surfaceHolder.lockCanvas();
synchronized (this.surfaceHolder) {
Thread.sleep(delay);
draw(new Img(canvas, size));
}
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
if (canvas != null) {
this.surfaceHolder.unlockCanvasAndPost(canvas);
}
}
synchronized (this) {
if (wait) {
try {
wait();
} catch (Exception e) {}
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
如果它是android三重缓冲 - 如何关闭它,或用它做一些事情?Android 4.2.1
我正在一个Android应用程序中绘制一个圆圈并将它们平均分开并将文本绑定在圆圈中的分割部分内(如pichart).我画了一个圆圈并将它们平分,但我想将文本绑定在分割部分内.请查看我的代码并提供解决方案.提前致谢.

public class MainActivity extends Activity {
/** Called when the activity is first created. */
float values[] = { 130, 130, 130, 130, 130 };
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
LinearLayout linear = (LinearLayout) findViewById(R.id.linearlay);
values = calculateData(values);
linear.addView(new MyGraphview(this, values));
}
private float[] calculateData(float[] data) {
float total = 0;
for (int i = 0; i < data.length; i++) {
total += data[i];
}
for (int i = 0; i < data.length; i++) {
data[i] …Run Code Online (Sandbox Code Playgroud) 我有一个自定义视图,在onDraw()我,我试图执行位图屏蔽.我有一个squareBitmap(红色)填充整个视图,我有一个circleBitmap(蓝色)充当面具.我正在使用模式:PorterDuff.Mode.DST_IN.
我期待的结果是一个红色的圆圈.我明白了,但我也得到了一个黑色的不透明背景.我不想要这种不透明的背景,而应该是透明的.Figure 1是我得到Figure 2的结果,是我正在寻找的结果.
我的代码:( onDraw()为了这个问题,我把所有内容都移到了里面)
protected void onDraw(Canvas canvas) {
final int width = canvas.getWidth();
final int height = canvas.getHeight();
Bitmap circleBitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
Canvas circleCanvas = new Canvas(circleBitmap);
Paint p = new Paint(Paint.ANTI_ALIAS_FLAG);
p.setStyle(Paint.Style.FILL_AND_STROKE);
p.setColor(Color.BLUE);
circleCanvas.drawCircle(width / 2, height / 2, width / 2, p);
p.setColor(Color.RED);
Bitmap squareBitmap = Bitmap.createBitmap(canvas.getWidth(), canvas.getHeight(), Bitmap.Config.ARGB_8888);
Canvas squareCanvas = new Canvas(squareBitmap);
final Rect squareRect = new Rect(0, …Run Code Online (Sandbox Code Playgroud) 首先,这是一个最初在这里提出的跟进问题,在Android中平移,缩放和缩放自定义的Canvas绘图视图
由于还没有答案,我终于使用android-gesture-detector解决了我的问题
应用缩放/缩放手势后,我发现,画布绘制坐标仍然指向旧位置(在应用缩放之前),而不是绘制完全相同的触摸坐标.基本上,在缩放或拖动画布后,我无法获得正确的画布坐标.
在缩放之前,
缩小后,触摸点将绘制在之前的位置.我希望它能够在当前触摸位置上绘制,
示例代码,
public class DrawingView extends View {
private void setupDrawing() {
mScaleDetector = new ScaleGestureDetector(getContext(), new ScaleListener());
mgd = new MoveGestureDetector(ctx, mgl);
sgd = new ScaleGestureDetector(ctx, sgl);
rgd = new RotateGestureDetector(ctx, rgl);
}
class ScaleListener extends ScaleGestureDetector.SimpleOnScaleGestureListener {
@Override
public boolean onScale(ScaleGestureDetector detector) {
mScaleFactor *= detector.getScaleFactor();
// Don't let the object get too small or too large.
mScaleFactor = Math.max(0.1f, Math.min(mScaleFactor, 5.0f));
invalidate();
return true;
}
}
MoveGestureDetector.SimpleOnMoveGestureListener mgl = new …Run Code Online (Sandbox Code Playgroud) android android-canvas android-view android-gesture android-touch-event
我正在尝试实现像这篇文章中突出显示的模糊效果:

我正在使用 Jetpack Compose:
@Composable
fun MainApp() {
val linearGradientBrush = Brush.linearGradient(
colors = listOf(
Color(0xFF5995EE),
Color(0xFFB226E1),
Color(0xFFE28548)
),
start = Offset(Float.POSITIVE_INFINITY, 0f),
end = Offset(0f, Float.POSITIVE_INFINITY),
)
val transparentGradientBrush = Brush.linearGradient(
colors = listOf(
Color(0x66FFFFFF),
Color(0x1AFFFFFF)
)
)
Column(
modifier = Modifier.fillMaxSize(),
verticalArrangement = Arrangement.Center,
horizontalAlignment = Alignment.CenterHorizontally
) {
Box() {
Card(
modifier = Modifier
.size(150.dp)
// .blur(10.dp, edgeTreatment = BlurredEdgeTreatment.Unbounded)
.clip(shape = CircleShape)
.background(linearGradientBrush),
backgroundColor = Color.Transparent,
elevation = 0.dp,
) {
}
Card(
modifier …Run Code Online (Sandbox Code Playgroud) android android-canvas android-blur-effect android-jetpack-compose
android ×10
android-canvas ×10
android-view ×3
bitmap ×1
exception ×1
java ×1
layer ×1
paint ×1