我是android编程的新手,我想弄清楚的是这个;
在我的布局中,我有一个TextView,ImageView和Button,所有这些都在垂直方向的LinearLayout上.
我希望能够在ImageView中动态绘制圆圈,而不会干扰我的其余布局(textview/button).我正在尝试创建一个画布,并使用画布中的drawcircle函数来设置圆的位置.然后以某种方式将该画布绘制到我的imageview.我不能让这个工作,这有什么诀窍吗?或者我的方法根本错了?如何在不重新创建整个布局的情况下将图形绘制到ImageView?
谢谢!
我有一个绘图应用程序需要大约2-5秒来加载复杂图纸的绘图(通过一个完成AsyncTask).为了获得更好的用户体验,在此期间我将应用程序目录中存储的PNG版本作为一个闪存ImageView,并在Activity构造函数中显示加载ProgressBar调用setContentView():
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<ImageView
android:id="@+id/flash"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:src="@color/note_bg_white"
android:contentDescription="@string/content_desc_flash_img"
android:focusable="false" />
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="6dp"
android:paddingLeft="6dp"
android:paddingRight="6dp"
android:gravity="bottom|center_vertical">
<ProgressBar
style="?android:attr/progressBarStyleHorizontal"
android:id="@+id/toolbar_progress"
android:layout_width="match_parent"
android:layout_height="18dp"
android:gravity="bottom|center_vertical" />
</RelativeLayout>
</FrameLayout>
Run Code Online (Sandbox Code Playgroud)
当AsyncTask完成后,我再调用setContentView()的新布局再次:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#ffffff">
<com.my.package.DrawingCanvas
android:id="@+id/canvas"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:focusable="true"
android:background="#ffffff" />
</RelativeLayout>
Run Code Online (Sandbox Code Playgroud)
当我使用一个简单的Canvas模型时,这非常有效,因为自定义DrawingCanvas View会onDraw()在向用户显示之前将绘图绘制到初始屏幕上,但现在使用SurfaceView带有绘图循环,我看到闪烁的布局,然后加载图形时,黑屏大约一秒钟,最后是新的DrawingCanvas.
我假设原因与绘制循环线程的启动时间有关,并且我已经离开了我onDraw()的内部SurfaceView,并且它被调用,但是可用的画布onDraw()似乎没有绘制到SurfaceView.我也尝试在XML中设置纯色背景,希望至少能够显示白色背景,但这些背景似乎永远不会生效,甚至从代码设置它. …
我试图在画布上绘制一个矩形,我正面临麻烦,以了解Android的矩形绘制的深度.我已经阅读了教程和每一个可能但我被卡住了.
在图像中,红色矩形是我的目标.

无论任何矩形大小,我都需要在基座上方和矩形中间绘制红色矩形.我在这里遇到的最糟糕的噩梦是理解X,Y宽度和高度坐标.
任何人都可以解释数学如何工作,有时我们上升,Y达到非常小但相同的宽度坐标更高.并且我永远无法正确地证明红色内部矩形.在某些屏幕中,它在其他一些屏幕上运行良好.红色矩形有时会从父矩形中出来.
议程是了解坐标如何工作并确保内部红色矩形的完整性
根据一个例子得到一个解释会很棒.我在用-
void drawRect(float left, float top, float right, float bottom, Paint paint)
Run Code Online (Sandbox Code Playgroud)
绘制矩形
这是我画Bitmap上Canvas的我的Android应用:
canvas.save();
canvas.scale(scale, scale, x, y);
canvas.drawBitmap(bitmap, x, y, null);
canvas.restore();
Run Code Online (Sandbox Code Playgroud)
但是,Bitmap没有平滑缩放,不执行抗锯齿.如何启用抗锯齿功能?
我正在为Android做一个小游戏.当它在白色背景上工作时它工作顺利,但是当我想要放置背景图像时,它变得越来越慢.首先我尝试将其添加为布局背景图像,但它非常慢,动画是逐帧发生的.然后我决定在画布上绘制背景图像作为位图,结果比前一个稍微快一点,但与白色背景相比仍然没什么.
我试图多次缩放图像,我用更高的分辨率,更低的分辨率做到了,但结果没有改变,它仍然更慢.
所以我想问一下,有没有办法在没有失去应用程序的平滑性和速度的情况下为Android应用程序添加背景图像?
谢谢
PS:我在Sony Tablet S上尝试我的应用程序
目标只是绘制一个位图,并在其顶部绘制消除位图底层区域的形状.
我创建了简单的概念证明代码,试图理解我应该如何去做.在这里的各种线程中,我发现了许多关于使用的提示:
android.graphics.PorterDuff.Mode.CLEAR
Run Code Online (Sandbox Code Playgroud)
下面的代码只是创建一个蓝色背景的屏幕,并添加自定义视图.此视图在其画布上绘制粉红色背景,位图图像(带有轻微边框以显示粉红色背景),黄色覆盖圆圈表示每个PorterDuffXfermode.
import android.app.Activity;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.PorterDuffXfermode;
import android.graphics.Paint.Style;
import android.graphics.PorterDuff.Mode;
import android.graphics.RectF;
import android.os.Bundle;
import android.view.View;
import android.view.Window;
import android.widget.RelativeLayout;
public class Test extends Activity {
Drawing d = null;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
RelativeLayout.LayoutParams rlp = null;
// Create the view for the xfermode test
d = new Drawing(this);
rlp = new RelativeLayout.LayoutParams(600, 900);
rlp.addRule(RelativeLayout.CENTER_IN_PARENT);
d.setLayoutParams(rlp);
RelativeLayout rl = new RelativeLayout(this); …Run Code Online (Sandbox Code Playgroud) 我经常看到以下代码
canvas.save().
canvas translate or rotate
some drawing
canvas.restore
Run Code Online (Sandbox Code Playgroud)
我不明白为什么我们保存然后恢复.什么是取消我们刚刚做的事情的重点!我相信我在这里遗漏了一些谢谢
我已经开发了一个Facebook画布应用程序,可以在网络上正常工作,iOS(移动网络视图)但在Android上,特别是Galaxy S4,该应用程序将无法加载,Facebook应用程序发出消息说:
"[AppName] is incompatible with your device. Please visit the App Centre to find apps for this device."
Run Code Online (Sandbox Code Playgroud)
设置了移动网址,它在iOS设备上正常运行HTTPS证书正确并且设置正确.
Facebook自己的文档声明,如果设置了移动URL,它将在Web视图中打开应用程序.但是,我甚至没有通过手机向我的服务器请求.
有任何想法吗??
编辑:真正的问题是我LinearLayout被另一个布局包裹,导致不正确的行为.Sanvywell接受的答案有一个更好,更完整的例子,说明如何在刷卡视图下绘制颜色,而不是我在问题中提供的代码片段.
现在,在ItemTouchHelper类的帮助下,RecyclerView小部件本身支持行扫描,我试图在应用程序中使用它,行的行为与Google的收件箱应用程序类似.也就是说,向左侧滑动执行一个动作,向右滑动则执行另一个动作.
使用ItemTouchHelper.SimpleCallback的onSwiped方法很容易实现动作本身.但是,我无法找到一种简单的方法来设置应该出现在当前正在刷卡的视图下方的颜色和图标(例如在谷歌的收件箱应用程序中).
要做到这一点,我试图覆盖ItemTouchHelper.SimpleCallback的onChildDraw方法,如下所示:
@Override
public void onChildDraw(Canvas c, RecyclerView recyclerView,
RecyclerView.ViewHolder viewHolder, float dX, float dY,
int actionState, boolean isCurrentlyActive) {
RecyclerViewAdapter.ViewHolder vh = (RecyclerViewAdapter.ViewHolder) viewHolder;
LinearLayout ll = vh.linearLayout;
Paint p = new Paint();
if(dX > 0) {
p.setARGB(255, 255, 0, 0);
} else {
p.setARGB(255, 0, 255, 0);
}
c.drawRect(ll.getLeft(), ll.getTop(), ll.getRight(), ll.getBottom(), p);
super.onChildDraw(c, recyclerView, viewHolder, dX, dY, actionState, isCurrentlyActive); …Run Code Online (Sandbox Code Playgroud) android android-layout android-canvas android-support-library android-recyclerview
我需要在我的片段中绘制三个圆圈,圆圈的大小不同,我引用此链接 我获得的结果是这个

这是我的XML代码:UPDATED
<?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="center" >
<TextView
android:id="@+id/large_volume"
android:layout_width="185dp"
android:layout_height="185dp"
android:background="@drawable/circle"
android:gravity="center"
android:text="My name is NON"
android:textColor="#FFFFFF"
android:textSize="10dp" />
<TextView
android:id="@+id/medium_volume"
android:layout_width="120dp"
android:layout_height="120dp"
android:layout_alignTop="@+id/large_volume"
android:layout_toRightOf="@+id/large_volume"
android:background="@drawable/circle"
android:gravity="center"
android:text="My name is NON"
android:textColor="#FFFFFF"
android:textSize="10dp" />
<TextView
android:id="@+id/TextView02"
android:layout_width="90dp"
android:layout_height="90dp"
android:layout_below="@+id/medium_volume"
android:layout_toRightOf="@+id/large_volume"
android:background="@drawable/circle"
android:gravity="center"
android:layout_marginTop="-3dp"
android:layout_marginLeft="-17dp"
android:text="My name is NON"
android:textColor="#FFFFFF"
android:textSize="10dp" />
</RelativeLayout>
Run Code Online (Sandbox Code Playgroud)
但我需要的是这样的 
你可以看到圈子必须紧密相连,但是当我使用XML视图时,我无法实现这一点.我怎样才能实现这一点,我需要onClickListeners在我的圈子中这就是为什么我使用视图
这可以通过Canvas绘图实现,我听说画布不是视图所以这会限制我给点击听众,如果我错了纠正我
更新:
我通过XML方法满足了我的需求,有没有办法通过画布绘图实现这一点,我应该发布另一个问题吗?
android ×10
android-canvas ×10
bitmap ×2
android-view ×1
antialiasing ×1
background ×1
draw ×1
facebook ×1
image ×1
imageview ×1
java ×1
ondraw ×1
surfaceview ×1