我想在画布上使用具有一定宽度(以像素为单位,或理想情况下为"dp")的线条显示X/Y数据.我已经尝试了Paint的setStrokeWidth(..)方法,这确实改变了线宽,但它不是我需要的.在我的例子中,我使用matrix.preScale(xScale,yScale)将我的画布缩放为"真实工程单位",因此X比例表示0到100,Y为0比1.Paint对象的setStrokeWidth()方法似乎设置笔划,使其遵循我的矩阵preScale()设置.换句话说,水平线绘制得非常薄,垂直线绘制得非常厚.
有没有办法配置Paint,这样无论绘制线的方向,其宽度都是一致的像素数?
我已经尝试定义一个Drawable,它是一个行,并从那里创建一个ShapeDrawable,然后将它应用到Paint但在运行时遇到一些讨厌的类转换错误.这让我觉得这是错误的做法.但也许我太早放弃了.
据我所知,有一些Android绘图/图表包可用,有些包含源代码,但我真的希望在这里了解平台,而不是使用第三方解决方案.
谢谢你的任何提示!丰富
Paint.setTypeface不适用于斜体或我正在以错误的方式做某事.我可以创建普通,粗体,等宽和衬线文本,但我不能创建斜体文本.它总是看起来很正常(或者在粗体斜体的情况下,它看起来很大胆).
//This will appear monospace
paint.setTypeface(Typeface.MONOSPACE);
canvas.drawText("foo", 10, 10, paint);
//This will appear serif
paint.setTypeface(Typeface.SERIF);
canvas.drawText("foo", 10, 10, paint);
//This will appear bold
paint.setTypeface(Typeface.defaultFromStyle(Typeface.BOLD));
canvas.drawText("foo", 10, 10, paint);
//This will NOT appear italic <=== PROBLEM
paint.setTypeface(Typeface.defaultFromStyle(Typeface.ITALIC));
canvas.drawText("foo", 10, 10, paint);
// This isn't working either <=== PROBLEM
paint.setTypeface(Typeface.create(Typeface.SANS_SERIF, Typeface.ITALIC));
Run Code Online (Sandbox Code Playgroud)
所以现在问题是:有一个已知的解决方法吗?我的简单目标是用斜体绘制一些单词......
我有一个图像,我把链接和文本与HTML图像映射.这很好.我想对图像的特定区域有一些悬停效果.例如,拍摄世界地图,当您将鼠标悬停在一个突出显示的国家/地区时.使用html图像映射和一些css它不是问题,也就是说,如果你有一个所有国家的所有多边形坐标的列表.
那我怎么得到那些?你不可能手动这样做.
我不是一个Photoshop专家,但我想你会在一个区域做一个"魔杖"选择,然后以某种方式列出用于创建选择的坐标.有这样的功能吗?
我个人使用Paint.Net进行简单的图像编辑,它没有我所知道的那个功能.
你知道这样做的方法吗?
我想在我自己的观点(R.id.view)上画画,但这段代码似乎没有任何效果.它根本不允许我画任何东西.
public class MainActivity extends Activity implements OnTouchListener
{
Path mPath;
Canvas canvas;
Paint mPaint;
MaskFilter mEmboss;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
View view=(View)findViewById(R.id.view1);
mPaint = new Paint();
mPaint.setAntiAlias(true);
mPaint.setDither(true);
mPaint.setColor(0xFFFF0000);
mPaint.setStyle(Paint.Style.STROKE);
mPaint.setStrokeJoin(Paint.Join.ROUND);
mPaint.setStrokeCap(Paint.Cap.ROUND);
mPaint.setStrokeWidth(12);
canvas = null;
//view.draw(canvas);
mPath = new Path();
Bitmap mBitmap;
//Paint mBitmapPaint = new Paint(Paint.DITHER_FLAG);
mBitmap = Bitmap.createBitmap(210, 170, Bitmap.Config.ARGB_8888);
canvas = new Canvas(mBitmap);
canvas.drawColor(0xFFAAAAAA);
canvas.drawBitmap(mBitmap, 0, 0, mPaint);
//canvas.drawPaint(mPaint);
view.draw(canvas);
canvas.drawPath(mPath, mPaint);
mEmboss = new EmbossMaskFilter(new float[] { 1, 1, 1 }, …Run Code Online (Sandbox Code Playgroud) 我在程序中创建了一个网格.以下是用于创建网格的代码.
import java.awt.Graphics;
import javax.swing.JComponent;
import javax.swing.JFrame;
class Grid extends JComponent {
public void paint(Graphics g) {
g.drawRect (10, 10, 800, 500);
for (int i = 10; i <= 800; i+= 10)
g.drawLine (i, 10, i, 510);
for (int i = 10; i <= 500; i+= 10)
g.drawLine (10, i, 810, i);
}
}
public class CoreControl {
public static void main(String[] a) {
JFrame window = new JFrame();
window.setSize(840,560);
window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
window.getContentPane().add(new Grid());
window.setVisible(true);
}
}
Run Code Online (Sandbox Code Playgroud)
我想要做的是创建一个函数,它将根据我给它的坐标绘制一个矩形(填充黑色).基本上我想用黑色填充网格的某些单元格,我的想法是在单元格坐标上绘制黑色填充的矩形.我该如何使用这个功能?
我尝试创建另一个名为drawRectangle的类,并在main函数中调用它,如window.getContentPane().add(new drawRectangle()); 但是这不起作用(只有drawRectangle显示而不是网格). …
我有一个QGLWidget在Qt应用程序中呈现OpenGL场景.我想添加一些覆盖在其上的半透明Qt小部件QGLWidget.这比标准小部件更难,因为OpenGL绘图上下文对于Qt的画家类是未知的.因此,如果我只是做了明显的事情并在QGLWidget例如顶部放置一个透明工具栏,则工具栏的透明部分将呈现黑色(绘制时无法访问OpenGL帧缓冲区).
似乎处理此类事情的推荐方法是在绘制OpenGL场景后重绘2D内容.只要您只是绘制简单的形状,链接的示例似乎非常简单.相反,我想要做的是推迟绘制一些子QWidget对象的绘画,以便在绘画事件中完成QGLWidget.
所以,我的问题归结为:
QWidget在正常的2D上下文中绘制.QGLWidget绘制构成背景的3D场景后绘制叠加层.这个列表中的第二项似乎很简单:我可以QWidget::render()在QGLWidget绘图事件中使用在视口顶部绘制所需的小部件.这很好用.
第一项更棘手:我需要一种方法来阻止小部件在正常的事件过程中绘画,并且只在QGLWidget油漆处理程序中绘制它们.一个显而易见的方法是使用隐藏叠加层QWidget::hide().这允许我按照我的意愿在OpenGL场景上绘制小部件.但是,由于窗口小部件是隐藏的,因此它们不响应鼠标或键盘事件.作为一个例子,我使用了一个QToolBar带有几个按钮,工具栏被正确绘制,但是没有功能(没有一个按钮响应点击).因此,如果沿着这条路走下去,似乎我需要一种方法来强制小部件仍然响应事件,即使它是隐藏的.
我尝试过的另一种方法是QToolBar使用事件过滤器拦截绘制事件,目的是阻止工具栏自行绘制.但是,工具栏仍然呈现; 我假设这是因为工具栏上的各种按钮都是仍然绘制的子窗口小部件,即使我拦截了父级的绘制事件.
关于我可以实现目标的方式的任何想法?
所以在最近的一个回答中,有人评论过此(关于绘画):
"这可能是90%Swing程序员的某种疾病:当他们制作自己的组件时,他们总是扩展JPanel而不是JComponent.为什么?"
我仍然是编程方面的新手,所以我认为现在称自己为Swing程序员为时尚早,因为我尚未找到自己的位置.但压倒一切JPanel只是我教的方式.所以我开始找到"为什么?"的答案.评论者的问题.这些是我找到的一些答案.
背景画是主要的区别.JComponent类不绘制其背景,因此您必须在重写的paintComponent方法中绘制背景.相比之下,JPanel有一个不透明的背景,可以通过调用它的paintComponennt方法来绘制.
一些程序员喜欢扩展JPanel类,而不是扩展JComponent.JPanel旨在成为可以包含其他组件的容器,但也可以在其上绘制.只有一个区别.面板是不透明的,这意味着它负责绘制其边界内的所有像素.最简单的方法是使用背景颜色绘制面板,方法是在每个面板子类的paintComponent方法中调用super.paintComponent:
如果将opaque属性设置为true ...那么Swing绘图系统不必浪费时间尝试在组件后面进行绘制,从而提高性能.
我认为最后一句话真的解释得最好.但是,除了透明度外,还有其他有益的原因"90%的Swing程序员都有这样的疾病"延伸JPanel,而不是JComponent?
当我开始绘画时,它会为整个背景着色,我的意思是它应该只绘制白点.应用程序截图如下.使用Android Paint,我想在背景可绘制的[Panda]上仅绘制白点并跳过任何其他颜色.
onDraw() 功能是:
protected void onDraw(Canvas canvas) {
canvas.drawPath(path, paint);
canvas.drawPath(circlePath, circlePaint);
for (Pair<Path,Integer> path_clr : path_color_list ){
paint.setColor(path_clr.second);
canvas.drawPath( path_clr.first, paint);
}
for (Pair<Path,Integer> path_clr : circular_path_color_list ){
circlePaint.setColor(path_clr.second);
canvas.drawPath( path_clr.first, paint);
}
}
Run Code Online (Sandbox Code Playgroud)
和onTouchEvent功能是:
public boolean onTouchEvent(MotionEvent event) {
float pointX = event.getX();
float pointY = event.getY();
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
circlePath.reset();
path.moveTo(pointX, pointY);
return true;
case MotionEvent.ACTION_MOVE:
path.lineTo(pointX, pointY);
circlePath.reset();
circlePath.addCircle(pointX, pointY, 10, Path.Direction.CW);
break;
case MotionEvent.ACTION_UP:
circlePath.reset();
break;
default:
return false;
} …Run Code Online (Sandbox Code Playgroud) 我已经使用以下方法实现了绘画/绘画:
- (void) touchesBegan: (NSSet *) touches withEvent: (UIEvent *) event
-(void) touchesMoved: (NSSet *) touches withEvent: (UIEvent *) event
- (void) touchesEnded: (NSSet *) touches withEvent: (UIEvent *) event
Run Code Online (Sandbox Code Playgroud)
现在的问题是,对于任何绘制的线,我想得到那个特定的线/油漆图像.我不想要整个屏幕的图像,只需要绘制线条/绘图的区域/边界.
原因是我想在该行/绘制的绘图上执行平移手势/删除功能.
用户可以绘制多条线,因此需要分别UIImage使用所有这些线.
任何逻辑或代码片段都会非常有用
提前致谢
我想要一个没有标题栏但有可调整大小的框架和阴影的窗口.这可以通过删除WS_CAPTION和添加WS_THICKFRAME轻松实现,但是,从Windows 10开始,有一个6px的白色非客户区域.
使用以下代码我创建一个窗口并用黑色绘制所有客户区域,窗口获得左,右和底部6px透明边距,但是上边距是白色.
#ifndef UNICODE
#define UNICODE
#endif
#include <windows.h>
LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE, PWSTR pCmdLine, int nCmdShow)
{
// Register the window class.
const wchar_t CLASS_NAME[] = L"Sample Window Class";
WNDCLASS wc = { };
wc.lpfnWndProc = WindowProc;
wc.hInstance = hInstance;
wc.lpszClassName = CLASS_NAME;
RegisterClass(&wc);
// Create the window.
HWND hwnd = CreateWindowEx(
0, // Optional window styles.
CLASS_NAME, // Window class
L"", // Window text
0,
// …Run Code Online (Sandbox Code Playgroud)