我正在创建一个应用程序,用户可以点击图像的一部分并在角落里获得放大版本WebView.我设法做了一个Paint可以制作缩放版本,但它显示错误的位置,就像有一些偏移.
我知道这个问题已经被问了很多次并且已经得到了回答,但似乎并没有帮助那些解决方案.
这是我用过的代码:
@Override
public boolean onTouchEvent(@NonNull MotionEvent event) {
zoomPos = new PointF();
zoomPos.x = event.getX();
zoomPos.y = event.getY();
matrix = new Matrix();
mShader = new BitmapShader(MainActivity.mutableBitmap, TileMode.CLAMP, TileMode.CLAMP);
mPaint = new Paint();
mPaint.setShader(mShader);
outlinePaint = new Paint(Color.BLACK);
outlinePaint.setStyle(Paint.Style.STROKE);
int action = event.getAction();
switch (action) {
case MotionEvent.ACTION_DOWN:
case MotionEvent.ACTION_MOVE:
zooming = true;
this.invalidate();
break;
case MotionEvent.ACTION_UP:
Point1 = true;
zooming = false;
this.invalidate();
break;
case MotionEvent.ACTION_CANCEL:
zooming = false;
this.invalidate();
break;
default:
break;
} …Run Code Online (Sandbox Code Playgroud) 我正在尝试将视觉效果应用于视图组.我的想法是获取视图组的位图,缩小它,将其重新展开,然后在视图组上绘制它,使其具有块状,低质量的效果.
我使用这段代码的大部分方式都是:
public class Blocker {
private static final float RESAMPLE_QUALITY = 0.66f; // less than 1, lower = worse quality
public static void block(Canvas canvas, Bitmap bitmap_old) {
block(canvas, bitmap_old, RESAMPLE_QUALITY);
}
public static void block(Canvas canvas, Bitmap bitmap_old, float quality) {
Bitmap bitmap_new = Bitmap.createScaledBitmap(bitmap_old, Math.round(bitmap_old.getWidth() * RESAMPLE_QUALITY), Math.round(bitmap_old.getHeight() * RESAMPLE_QUALITY), true);
Rect from = new Rect(0, 0, bitmap_new.getWidth(), bitmap_new.getHeight());
RectF to = new RectF(0, 0, bitmap_old.getWidth(), bitmap_old.getHeight());
canvas.drawBitmap(bitmap_new, from, to, null);
}
}
Run Code Online (Sandbox Code Playgroud)
我只是传递画布来绘制和一个需要按比例缩小+向上的位图,它运行良好.
public class BlockedLinearLayout …Run Code Online (Sandbox Code Playgroud) 我有一个SweepGradient定义为
circle_paint.setShader(new SweepGradient(getWidth()/2, getHeight()/2, new int[] { circle_start_color, circle_end_color}, new float[] { 0f, 1f}))
Run Code Online (Sandbox Code Playgroud)
应用于定义为的拱门
canvas.drawArc(circle_bounds, circle_start_perc*360f, circle_end_perc*360f, true, circle_paint);
Run Code Online (Sandbox Code Playgroud)
这很好用,但我需要拱门从屏幕顶部开始绘图,即
canvas.drawArc(circle_bounds, ((circle_start_perc*360f)-90f)%360, circle_end_perc*360f, true, circle_paint);
Run Code Online (Sandbox Code Playgroud)
问题是SweepGradient似乎仍然从0度开始,我需要它从270度开始(类似于绘制弧线时的平移).换句话说,如果我有一个从白色到蓝色的渐变,我需要将弧的顶部涂成白色,并将弧的最后部分涂成蓝色.我怎样才能做到这一点?
我正在开发一个应用程序,它在一堆图像上绘制线条.为了选择这些图像,我有一个广播组,每当用户点击一个单选按钮时,图像就会加载所有图纸.
在我的收音机听众中,我有以下代码:
bitmap = BitmapUtils.decodeSampledBitmapFromResource(root + DefinesAndroid.CAMINHO_SHOPPINGS_SDCARD + nomeImagemAtual, size.x, size.y);
mImage.setImageBitmap(bitmap);
mImage.setDrawLines(true);
mImage.setImageBitmap(loadBitmapFromView(mImage));
Run Code Online (Sandbox Code Playgroud)
decodeSampledBitmapFromResource我从Android开发人员的这个链接获得的方法(它更有效地加载位图)http://developer.android.com/training/displaying-bitmaps/load-bitmap.html
这是我调用以获取视图位图的方法
public static Bitmap loadBitmapFromView(View v) {
Bitmap b = Bitmap.createBitmap( v.getLayoutParams().width, v.getLayoutParams().height, Bitmap.Config.ARGB_8888);
Canvas c = new Canvas(b);
v.layout(0, 0, v.getLayoutParams().width, v.getLayoutParams().height);
v.draw(c);
return b;
}
Run Code Online (Sandbox Code Playgroud)
我正在设置图像Bitmap,mImage因为我正在使用ImageViewTouch库(它可以在ImageView上进行缩放缩放),如果我不这样做,所有画布绘图都会被删除,图像上的任何交互都会被删除(比如放大/出).
错误日志如下
07-11 21:13:41.567: E/AndroidRuntime(20056): java.lang.IllegalArgumentException: width and height must be > 0
07-11 21:13:41.567: E/AndroidRuntime(20056): at android.graphics.Bitmap.createBitmap(Bitmap.java:638)
07-11 21:13:41.567: E/AndroidRuntime(20056): at android.graphics.Bitmap.createBitmap(Bitmap.java:620)
Run Code Online (Sandbox Code Playgroud)
我几乎可以肯定这个错误正在发生,因为当我调用getBitmapFromView方法时图像位图没有完全加载.
如何知道视图何时完全加载?
我目前通过绘制到画布在我的应用程序中创建一个圆形版本的图像.我想在图像周围画一个微弱的outershadow,但我不能完全正确.我有两个问题:1.如何绘制外部阴影(我似乎只能用ax或y偏移绘制阴影)2.如何绘制阴影,使其没有附加图像中显示的瑕疵.码:
![public Bitmap getRoundedCornerBitmap(Bitmap bitmap, float cornerRadius) {
Bitmap output = Bitmap.createBitmap(bitmap.getWidth()+6, bitmap.getHeight() +6, Config.ARGB_8888);
Canvas canvas = new Canvas(output);
final int color = 0xff424242;
int shadowRadius = getDipsFromPixel(3);
final Rect imageRect = new Rect(shadowRadius, shadowRadius, bitmap.getWidth(), bitmap.getHeight());
final RectF rectF = new RectF(imageRect);
// This does not achieve the desired effect
Paint shadowPaint = new Paint();
shadowPaint.setAntiAlias(true);
shadowPaint.setColor(Color.BLACK);
shadowPaint.setShadowLayer((float)shadowRadius, 2.0f, 2.0f,Color.BLACK);
canvas.drawOval(rectF, shadowPaint);
canvas.drawARGB(0, 0, 0, 0);
final Paint paint = new Paint();
paint.setAntiAlias(true);
paint.setColor(color);
canvas.drawRoundRect(rectF, cornerRadius, cornerRadius, paint); …Run Code Online (Sandbox Code Playgroud) 我的应用程序在nougat模拟器和许多设备上工作得很好,但我在google play crash中发现了这个例外,我不知道为什么会发生这种情况,只有nougat设备才会导致异常.
例外:
java.lang.RuntimeException:
at android.view.DisplayListCanvas.throwIfCannotDraw(DisplayListCanvas.java:260)
at android.graphics.Canvas.drawBitmap(Canvas.java:1420)
at android.graphics.drawable.BitmapDrawable.draw(BitmapDrawable.java:545)
at android.view.View.getDrawableRenderNode(View.java:18591)
at android.view.View.drawBackground(View.java:18527)
at android.view.View.draw(View.java:18315)
at android.view.View.updateDisplayListIfDirty(View.java:17302)
at android.view.View.draw(View.java:18086)
at android.view.ViewGroup.drawChild(ViewGroup.java:3966)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3752)
at android.view.View.updateDisplayListIfDirty(View.java:17297)
at android.view.View.draw(View.java:18086)
at android.view.ViewGroup.drawChild(ViewGroup.java:3966)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3752)
at android.view.View.updateDisplayListIfDirty(View.java:17297)
at android.view.View.draw(View.java:18086)
at android.view.ViewGroup.drawChild(ViewGroup.java:3966)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3752)
at android.view.View.updateDisplayListIfDirty(View.java:17297)
at android.view.View.draw(View.java:18086)
at android.view.ViewGroup.drawChild(ViewGroup.java:3966)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3752)
at android.view.View.updateDisplayListIfDirty(View.java:17297)
at android.view.View.draw(View.java:18086)
at android.view.ViewGroup.drawChild(ViewGroup.java:3966)
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3752)
at android.view.View.draw(View.java:18327)
at com.android.internal.policy.DecorView.draw(DecorView.java:919)
at android.view.View.updateDisplayListIfDirty(View.java:17302)
at android.view.ThreadedRenderer.updateViewTreeDisplayList(ThreadedRenderer.java:692)
at android.view.ThreadedRenderer.updateRootDisplayList(ThreadedRenderer.java:698)
at android.view.ThreadedRenderer.draw(ThreadedRenderer.java:806)
at android.view.ViewRootImpl.draw(ViewRootImpl.java:3135)
at android.view.ViewRootImpl.performDraw(ViewRootImpl.java:2931)
at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:2523)
at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1522)
at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:7098)
at …Run Code Online (Sandbox Code Playgroud) 我有一个自定义WebView,我想获得其内容的位图(包括屏幕外).我使用了这个代码,我从这里得到了:
public static Bitmap getBitmapFromWebviewV2(WebView webView) {
webView.measure(View.MeasureSpec.makeMeasureSpec(
View.MeasureSpec.UNSPECIFIED, View.MeasureSpec.UNSPECIFIED),
View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED));
webView.layout(0, 0, webView.getMeasuredWidth(),
webView.getMeasuredHeight());
webView.setDrawingCacheEnabled(true);
webView.buildDrawingCache();
Bitmap bm = Bitmap.createBitmap(webView.getMeasuredWidth(),
webView.getMeasuredHeight(), Bitmap.Config.ARGB_8888);
Canvas bigcanvas = new Canvas(bm);
Paint paint = new Paint();
int iHeight = bm.getHeight();
bigcanvas.drawBitmap(bm, 0, iHeight, paint);
webView.draw(bigcanvas);
return bm;
}
Run Code Online (Sandbox Code Playgroud)
当我放大很多时,它工作正常,在这种情况下我得到OutOfMemory Crash.我用相同的图片(略微缩放并缩放到最大值)测试了它,它的行为与我上面提到的相同.
我试图通过添加来解决这个问题
while(webView.canZoomOut()){
webView.zoomOut();
}
Run Code Online (Sandbox Code Playgroud)
在一开始,但它根本没有帮助.
我试过很多教程
但是没有得到正确的结果,任何人都可以帮助我获得完美的结果.
提前致谢.
我希望在 Jetpack Compose 的画布上画一条弧线,并在进度边缘画一个小圆圈,如下图所示:
我找到了如何用圆弧画布绘制进度条,但还不知道如何绘制圆圈以与圆弧线的边缘相匹配。这是我的进度代码:
@Composable
fun ComposeCircularProgressBar(
modifier: Modifier = Modifier,
percentage: Float,
fillColor: Color,
backgroundColor: Color,
strokeWidth: Dp
) {
Canvas(
modifier = modifier
.padding(strokeWidth / 2)
) {
// Background Line
drawArc(
color = backgroundColor,
135f,
270f,
false,
style = Stroke(strokeWidth.toPx(), cap = StrokeCap.Butt)
)
// Fill Line
drawArc(
color = fillColor,
135f,
270f * percentage,
false,
style = Stroke(strokeWidth.toPx(), cap = StrokeCap.Round)
)
}
}
Run Code Online (Sandbox Code Playgroud)
注意:目前我知道绘制那个圆圈,Canvas.drawCircle(offset = Offset)但我还不知道如何计算Offset(x,y)与进度边缘相匹配。
我想实现一种功能,当有人试图解锁我的设备并输入错误密码3次时,通过前置摄像头捕获图像.我检查过它可以在Android中使用,某些应用程序也可以在Market中使用.
我已经做了一些工作来实现这一目标,但我得到了一个黑色的图像.这是代码:
注册设备管理员以获取广播的错误密码尝试:
public class DeviceAdminSample extends DeviceAdminReceiver {
static Context ctx;
static SharedPreferences getSamplePreferences(Context context) {
ctx = context;
return context.getSharedPreferences(
DeviceAdminReceiver.class.getName(), 0);
}
@Override
public void onPasswordFailed(Context context, Intent intent) {
super.onPasswordFailed(context, intent);
System.out.println("Password Attempt is Failed...");
Intent i = new Intent(context, CameraView.class);
i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(i);
}
}
Run Code Online (Sandbox Code Playgroud)
Camera Class捕获图像并将其保存到SD卡:
public class CameraView extends Activity implements SurfaceHolder.Callback,
OnClickListener {
private static final String TAG = "CameraTest";
Camera mCamera;
boolean mPreviewRunning = false;
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
Log.e(TAG, …Run Code Online (Sandbox Code Playgroud) android android-intent android-camera android-camera-intent android-canvas
android ×10
android-canvas ×10
bitmap ×2
android-view ×1
gradient ×1
imageview ×1
kotlin ×1
ondraw ×1
webview ×1