标签: android-canvas

如何放大/缩放图像的一部分

我正在创建一个应用程序,用户可以点击图像的一部分并在角落里获得放大版本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)

android android-canvas

14
推荐指数
1
解决办法
2589
查看次数

绘制视图和所有它的孩子

我正在尝试将视觉效果应用于视图组.我的想法是获取视图组的位图,缩小它,将其重新展开,然后在视图组上绘制它,使其具有块状,低质量的效果.

我使用这段代码的大部分方式都是:

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)

android android-canvas android-view

13
推荐指数
1
解决办法
6903
查看次数

Android SweepGradient

我有一个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度开始(类似于绘制弧线时的平移).换句话说,如果我有一个从白色到蓝色的渐变,我需要将弧的顶部涂成白色,并将弧的最后部分涂成蓝色.我怎样才能做到这一点?

android gradient ondraw android-canvas

13
推荐指数
2
解决办法
4781
查看次数

如何在Android中完全加载ImageView时获取

我正在开发一个应用程序,它在一堆图像上绘制线条.为了选择这些图像,我有一个广播组,每当用户点击一个单选按钮时,图像就会加载所有图纸.

在我的收音机听众中,我有以下代码:

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方法时图像位图没有完全加载.

如何知道视图何时完全加载?

android bitmap imageview android-canvas

13
推荐指数
2
解决办法
9284
查看次数

绘制图像时绘制外部阴影

我目前通过绘制到画布在我的应用程序中创建一个圆形版本的图像.我想在图像周围画一个微弱的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)

android android-canvas

13
推荐指数
3
解决办法
2万
查看次数

错误:DisplayListCanvas.throwIfCannotDraw上的RuntimeException

我的应用程序在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)

android android-canvas android-bitmap

13
推荐指数
3
解决办法
5473
查看次数

从WebView获取位图会导致OutOfMemory崩溃

我有一个自定义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)

在一开始,但它根本没有帮助.

android bitmap webview android-canvas

13
推荐指数
1
解决办法
347
查看次数

自定义按钮背景有对角切口视图

我想设置背景,如图所示 在此输入图像描述

我试过很多教程

但是没有得到正确的结果,任何人都可以帮助我获得完美的结果.

提前致谢.

android android-canvas android-drawable

13
推荐指数
1
解决办法
961
查看次数

Jetpack 用点圆绘制圆弧

我希望在 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)与进度边缘相匹配。

android android-canvas kotlin android-jetpack-compose

13
推荐指数
1
解决办法
5631
查看次数

使用密码锁定设备时捕获图像

我想实现一种功能,当有人试图解锁我的设备并输入错误密码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

12
推荐指数
1
解决办法
5189
查看次数