标签: android-canvas

在画布上绘图并保存图像

我是Android Graphics类的新手.我想使用触摸事件绘制图像(实际上是签名类型),并希望在我想保存时将其保存在SD卡上.我已经通过网络扫描了任何这样的教程,但我还没有找到.谁能告诉我如何使用触摸事件在画布上绘制并保存它.

任何教程或示例代码都会有很大帮助.

graphics android handwriting android-canvas

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

Android SurfaceView上的缩放效果

我正在开发赛车游戏.我能够移动,停止,加速.但是我希望当我按屏幕然后car(bitmap of car image)应该看起来,它已经跳到它的位置.我正在使用surfaceview绘制视图

我不想使用3D openGL.任何帮助深表感谢

android surfaceview android-canvas

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

Canvas.drawBitmap()间歇性地减慢,导致白色闪烁

我正在制作一个带滚动背景的动态壁纸.我有两个位图对象,我之间交替,以保持下一帧的先前绘制的像素.我在画布顶部绘制一个新行,然后调用drawBitmap将其余像素复制到画布上.

我正在使用Runnable对象来完成繁重的工作.它执行所需的所有复制和计算,然后锁定画布,在持有者上输入同步块,并对Canvas.drawBitmap(位图,rect,rect,paint)进行单次调用.屏幕上偶尔会出现白色闪烁,这似乎与高CPU活动有关.在使用traceview时,我发现drawBitmap操作,特别是Canvas.native_drawBitmap(),比正常时间长得多.通常它在2-4毫秒内完成,但是当我看到白色闪光时,它可能需要10到100毫秒.

private void draw() {
    SurfaceHolder holder = getSurfaceHolder();

    Canvas canvas = null;
    prepareFrame();
    try {
        canvas = holder.lockCanvas();
        synchronized (holder) {
            if (canvas != null) {
                drawFrame(canvas);
            }
        }
    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        if (canvas != null)
            holder.unlockCanvasAndPost(canvas);
    }
    afterDrawFrame();
    handler.removeCallbacks(drawRunner);
    if (visible) {
        handler.post(drawRunner);
    }
}
Run Code Online (Sandbox Code Playgroud)

draw()函数run()在Runnable中调用.

private void prepareFrame() {
    num++;
    if (num%2 == 0) {
        mainBmp = mainBmp1;
        mainCan.setBitmap(mainBmp1);
        mainCan.drawBitmap(mainBmp2, source, destination, null);
    } else { …
Run Code Online (Sandbox Code Playgroud)

android android-canvas

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

画布不会在自定义视图中绘制

我创建了一个自定义视图CircleView,如下所示:

public class CircleView extends LinearLayout {

    Paint paint1;
    public CircleView(Context context) {
        super(context);
        init();
    }   
    public CircleView(Context context, AttributeSet attrs) {
        super(context, attrs);
        init();
    }
    public void init() {
        paint1 = new Paint();
        paint1.setColor(Color.RED); 
    }       
    protected void onDraw(Canvas canvas) {
        //super.onDraw(canvas);         
        canvas.drawCircle(50, 50, 25, paint1);
        this.draw(canvas);  
    }
}
Run Code Online (Sandbox Code Playgroud)

然后我将它包含在我的Activity的布局根目录中<RelativeLayout>:

  <com.turkidroid.test.CircleView
      android:id="@+id/circle_view"
      android:layout_width="fill_parent"
      android:layout_height="fill_parent" 
      android:layout_centerInParent="true"  />  
Run Code Online (Sandbox Code Playgroud)

但是,没有画出来!

  • 我是否正在实施自定义视图?
  • 或者我是如何使用自定义视图的?

一些信息:

  • CircleView和MyActivity都在同一个包中:com.turkidroid.test.
  • onDraw()方法中,我尝试包含super.onDraw()和评论它.
  • 我知道我可以使用更简单的方法绘制一个圆,但我的CircleView 包含的不仅仅是绘制一个圆.我需要将其设为自定义视图.

android android-custom-view android-canvas

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

绘制带圆角的LinearLayout

我正在尝试实现一个使用圆角绘制自己的LinearLayout子类.根据我的研究,我设置setWillNotDraw(false)并覆盖onDraw()在画布上绘制一个圆角矩形:

@Override
protected void onDraw(Canvas canvas) {
    super.onDraw(canvas);

    int sc = canvas.saveLayer(0, 0, getWidth(), getHeight(), drawPaint, Canvas.MATRIX_SAVE_FLAG | Canvas.CLIP_SAVE_FLAG | Canvas.HAS_ALPHA_LAYER_SAVE_FLAG
            | Canvas.FULL_COLOR_LAYER_SAVE_FLAG | Canvas.CLIP_TO_LAYER_SAVE_FLAG);
    canvas.drawRoundRect(bounds, mCornerRadius, mCornerRadius, roundPaint);
    canvas.restoreToCount(sc);
}
Run Code Online (Sandbox Code Playgroud)

哪里:

drawPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
drawPaint.setColor(0xffffffff);
drawPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_IN));

roundPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
roundPaint.setColor(0xffffffff);
Run Code Online (Sandbox Code Playgroud)

DST_IN这里似乎是正确的选择(根据APIDemos示例),但应该是透明的区域(圆形的)具有黑色背景,并且子项的角仍然可见.这是使用Android 4.2.2的Galaxy Nexus的结果:

例

任何提示?

编辑:这是我想要实现的,抱歉photoshopping的粗糙:)

在此输入图像描述

编辑2:我向GitHub添加了一个可运行的示例项目:https://github.com/venator85/RoundClippingLayout

谢谢 ;)

android android-canvas

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

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

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

setDither,setFilterBitmap和setAntiAlias在Canvas中做了什么?

通常我看到的样本,在尝试在画布上绘制位图时使用此方法.例如:

paint.setAntiAlias(true);
paint.setFilterBitmap(true);
paint.setDither(true);
Run Code Online (Sandbox Code Playgroud)

但我不知道这三种方法是做什么的?当我必须使用它们时?

android bitmap android-canvas

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

Android中的椭圆视图

我需要创建一系列同心椭圆(环),并需要在这些椭圆的圆周上放置用户图标.见下图.

戒指视图

直到现在我在画布上绘制了3个椭圆同心圆并放置了用户图标.我需要用户图标可以跨越环.

请提供实施方法.

android android-custom-view android-canvas

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

我们怎样才能优化(cpu&ram)这个android自定义初始化动画?

我为Splash Screen活动开发了一个自定义动画:

=>这是一个动画,显示正在发生的事情:

在此输入图像描述

当然我的真实应用:

  • 是用不同的图片(fullhd)
  • 与GIF相比有点慢:60个中间屏幕为3s.

我的设计师为我提供了60个png文件.

=>举例说明:

在此输入图像描述

我的目标是:

  1. 从中央徽标(此处带有SO)开始,带有底部图片(Apple)
  2. 运行变形动画
  3. 像应用程序的主页一样在屏幕上结束

为了运行它,我有一个SpashScreenActivity的多层布局:

  • BackGround(不可见):homePage的布局(MainActivity)
  • MiddleGround:Apple的ImageView被Droid和bottomBar所取代
  • FrontGround:ImageView中的徽标,其标语为TextView

以下是SpashScreen布局的xml代码:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="bottom">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:visibility="invisible"
        android:orientation="vertical">

        <FrameLayout
            android:id="@+id/fl_logo_top_marge_hidden"
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:layout_weight="1"
            android:visibility="invisible"
            android:background="@color/colorPrimary" />

        <include
            android:visibility="invisible"
            android:id="@+id/l_logo_activate_hidden"
            layout="@layout/part_logo_activate"
            android:layout_width="match_parent"
            android:layout_height="wrap_content" />

        <FrameLayout
            android:visibility="invisible"
            android:id="@+id/fl_logo_bottom_marge_hidden"
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:layout_weight="1"
            android:background="@color/colorPrimary" />

        <fr.millezimsolutions.app.splashanimation.SquareAspectWidthBasedImageView
            android:visibility="invisible"
            android:id="@+id/iv_home_hidden"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:scaleType="fitXY"
            android:src="@drawable/p_log_android" />

        <FrameLayout
            android:visibility="invisible"
            android:id="@+id/fl_bar_hidden"
            android:layout_width="match_parent"
            android:layout_height="@dimen/start_degustation_bar_height"
            android:background="@color/colorAccent"
            android:gravity="bottom" />
    </LinearLayout>


    <LinearLayout
        android:id="@+id/fl_middle"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_alignParentBottom="true"
        android:background="@color/colorPrimary"
        android:gravity="bottom"
        android:orientation="vertical">

        <fr.millezimsolutions.app.splashanimation.FitXCropTopImageView
            android:id="@+id/iv_slogan" …
Run Code Online (Sandbox Code Playgroud)

optimization animation android android-animation android-canvas

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

Android 旋转文本:我使用 dynamiclayout.draw(canvas) 但它不沿路径设置动画,并且不能使用 canvas.drawTextOnPath(dynamiclayout)

我正在使用我自己的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 库。为了简化它(更少的类,更少的方法,没有未使用的方法等)。事实上,我只有两个类:

  1. RotatingTextSwitcher,这是 XML 小部件

  2. And Rotatable,其中包含要旋转的字符串数组。

  3. 包含 XML 小部件的 .XML 布局RotatingTextSwitcher以对其进行测试

  4. 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

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