可能重复:
将视图转换为位图而不在Android中显示它?
我正在尝试将视图从以下引用链接转换为位图
现在的问题是如何才能获得仅从视图转换的位图.在示例作者中使用了relativelayout.dispatchDraw(c),但这一行给出了编译时错误,即
来自ViewGroup类型的方法dispatchDraw(Canvas)不可见
这是我的代码,我在onCreate函数中编写了以下代码
Canvas c=null;
//Create Layout
RelativeLayout relativeView ;
RelativeLayout.LayoutParams lp = new RelativeLayout.LayoutParams(
RelativeLayout.LayoutParams.MATCH_PARENT, RelativeLayout.LayoutParams.MATCH_PARENT
);
relativeView = new RelativeLayout(this);
relativeView.setLayoutParams(lp);
//Background of Layout
Bitmap viewBgrnd = BitmapFactory.decodeResource(getResources(),R.drawable.bgblack);
relativeView.setBackgroundDrawable(new BitmapDrawable(viewBgrnd));
//associated with canvas
Bitmap returnedBitmap = Bitmap.createBitmap(320,480,Bitmap.Config.ARGB_8888);
c = new Canvas(returnedBitmap);
Paint paint = new Paint();
//Create Imageview that holds image
ImageView newImage = new ImageView(this);
Bitmap srcBitmap = BitmapFactory.decodeResource(getResources(),R.drawable.bgpink);
newImage.setImageBitmap(srcBitmap);
TextView newText = new TextView(this);
newText.setText("This is the text that its going to …Run Code Online (Sandbox Code Playgroud) 我已经坚持这个问题八个小时了,所以我觉得是时候得到一些帮助了.
在我开始我的问题之前,我只会让我知道我已经通过这个网站和谷歌,我找到的答案都没有帮助.(这是一个,另一个,另一个.)
这是交易:我有一个扩展的类SurfaceView(让我们称之为MySurface)并覆盖其中的许多方法.通常情况下,它会绘制几个正方形和文本框,这一切都很好.一旦用户开始触摸,它就会转换为a Bitmap,然后绘制每个帧,直到用户释放.
这就是问题:我想实现这样一种功能:用户可以将两根手指放在屏幕上,捏缩放,也可以平移(但只能用两根手指向下).
我发现了一些缩放到缩放的实现,并通过以下方式将它们改编为我的Canvas对象MySurface:
public void onDraw(Canvas canvas) {
super.onDraw(canvas);
canvas.save();
canvas.scale(mScaleVector.z, mScaleVector.z); // This is the scale factor as seen below
canvas.translate(mScaleVector.x, mScaleVector.y); // These are offset values from 0,0, both working fine
// Start draw code
// ...
// End draw code
canvas.restore();
}
private class ScaleListener extends ScaleGestureDetector.SimpleOnScaleGestureListener {
@Override
public boolean onScale(ScaleGestureDetector detector) {
float factor = detector.getScaleFactor();
if …Run Code Online (Sandbox Code Playgroud) 我成功地在画布上的图像中实现了一个缩放放大/缩小和拖放功能.
现在我想要的是重新调整大小,下面的图像链接基于iPhone App
那么我怎样才能在Android中实现这种功能呢?
我想问一下如何在imageView上实现或添加标记.我使用svglib渲染了一个SVG并使用了customImageView,这样我就可以缩放和平移图像.
这是我如何使用我的customImageView的代码
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
SVG svg;
switch (mNum) {
case 1:
svg = SVGParser.getSVGFromResource(getResources(), R.raw.t1);
break;
case 2:
svg = SVGParser.getSVGFromResource(getResources(), R.raw.t2);
break;
case 3:
svg = SVGParser.getSVGFromResource(getResources(), R.raw.t3);
break;
case 4:
svg = SVGParser.getSVGFromResource(getResources(), R.raw.t4);
break;
default:
svg = SVGParser.getSVGFromResource(getResources(),
R.raw.android);
}
View v = inflater.inflate(R.layout.hello_world, container, false);
View tv = v.findViewById(R.id.text);
imageView = (GestureImageView) v.findViewById(R.id.imageView1);
imageView.setStrict(false);
imageView.setStartingScale(lastScale);
// if(lastXPosition!=0 && lastYPosition!=0)
imageView.setStartingPosition(lastXPosition, lastYPosition);
// Log.i("tag",
// "lastXPosition" + lastXPosition);
// …Run Code Online (Sandbox Code Playgroud) 我正在尝试旋转我的子类TextView使用canvas.rotate():
canvas.save();
final int w = getWidth();
final int h = getHeight();
float px = w/2f;
float py = h/2f;
canvas.rotate(mAngle, px, py);
super.draw(canvas);
canvas.restore();
Run Code Online (Sandbox Code Playgroud)
旋转TextView,但我的视图边界被剪裁:

我知道这是因为我的视图大小 - 它在旋转期间不会发生变化.但是,如果我将改变宽度\高度onMeasure问题将保持 - 我正在使用LayoutParams.WRAP_CONTENT,所以TextView只需根据提供的值更改它的大小setMeasuredDimensions.
我怎么解决这个问题?
我正在创建一个自定义视图,这是一种圆弧滑块进度视图.我可以根据用户触摸的位置(在x轴上)通过计算扫描来绘制更多或更少的弧,我通过首先计算百分比来做到这一点用户沿x轴触摸的位置.0%将一直向左,100%将一直向右.
我想更进一步,而不是基于用户按下的x坐标绘制弧,我想让它仅在用户触摸实际弧形绘制路径时移动,因此它更加逼真.我仍然是新的自定义视图,我的数学是有限的,但如果我得到一些提示,我将不胜感激

class ArcProgress extends View {
Context cx;
float width;
float height;
float center_x, center_y;
final RectF oval = new RectF();
final RectF touchArea = new RectF();
float sweep = 0;
float left, right;
int percent = 0;
public ArcProgress(Context context) {
super(context);
cx = context;
}
public int getPercentage() {
return percent;
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
setBackgroundColor(0xfff0ebde);
width = (float) getWidth();
height = (float) getHeight();
float radius;
if (width > height) {
radius = …Run Code Online (Sandbox Code Playgroud) 我有一个画布应用程序.我正在尝试用Canvas+ 创建一个签名应用程序onTouchListener.
这是我的保存方法,我尝试将签名保存到图像:
private void save() {
hideMenuBar();
View content = this;
content.setDrawingCacheEnabled(true);
content.setDrawingCacheQuality(View.DRAWING_CACHE_QUALITY_HIGH);
Bitmap bitmap = content.getDrawingCache();
String path = Environment.getExternalStorageDirectory().getAbsolutePath();
String imgPath = path+"/imotax/capture/spop/ttd/image" + "temp" + ".jpg";
File file = new File(imgPath);
FileOutputStream ostream;
try {
file.createNewFile();
ostream = new FileOutputStream(file);
bitmap.compress(CompressFormat.JPEG, 100, ostream);
ostream.flush();
ostream.close();
Toast.makeText(getContext(), "image saved", 5000).show();
} catch (Exception e) {
e.printStackTrace();
Log.i("ttd", e.toString());
Toast.makeText(getContext(), "Failed To Save", 5000).show();
showMenuBar();
}
}
Run Code Online (Sandbox Code Playgroud)
我不知道为什么,但它总是错误或进入catch带有此错误的语句:
java.io.IOException: open failed: ENOENT …Run Code Online (Sandbox Code Playgroud) 您好我的自定义视图:
MyCustomView extends View
Run Code Online (Sandbox Code Playgroud)
我做了一个VectorDrawable
mMyVectorDrawable = VectorDrawableCompat.create(getContext().getResources(), R.drawable.ic_some_image, null);
Run Code Online (Sandbox Code Playgroud)
我已经设定了界限
mMyVectorDrawable.setBounds(0, 0, mMyVectorDrawable.getIntrinsicWidth(), mMyVectorDrawable.getIntrinsicHeight());
Run Code Online (Sandbox Code Playgroud)
我在画布上绘制它
mMyVectorDrawable.draw(canvas);
Run Code Online (Sandbox Code Playgroud)
我在0,0位置看到了图像
但我该如何定位呢?如何定位Rect,我认为前两个参数setBounds将是X和Y坐标的开始绘图,但这只会影响尺寸.
如何将矢量绘图放在画布上?
谢谢阅读
我想绘制一个圆形矩形,其笔划为蓝色,填充为红色,但我在Paint类中找不到设置笔触颜色的方法.我怎样才能做到这一点?
mCanvas.drawColor(mBackgroundColor, PorterDuff.Mode.CLEAR);
mCanvas.setDrawFilter(mPaintFlagsDrawFilter);
mPaint.setStyle(Paint.Style.FILL_AND_STROKE);
mPaint.setColor(Color.RED);
mPaint.setStrokeWidth(2);
mPaint.setStrokeCap(Paint.Cap.ROUND);
mRectF.set(0, 0, mWidth, mHeight);
mCanvas.drawRoundRect(mRectF, 10, 10, mPaint);
Run Code Online (Sandbox Code Playgroud) 目前我正在使用paintObject.measureText(textCopy.substring(0,i))迭代TextView文本的副本.例如,measureText("abc".substring(0,1))将给出'b'的相对x坐标.我得到的y坐标layout.getLineTop().这是工作,但不准确的X坐标非等宽字体.我可以稍微校准,但在每个设备上它的工作方式不同.
我能想到的最好的解决方案是覆盖负责在屏幕上绘制TextView的类,并希望获得绘制到屏幕上的每个字符的坐标.
有谁知道我需要覆盖什么类来完成这个?或者其他一些创意解决方案?