我正在为gnome编写一个扩展/小部件,所以我想使用文本显示一些信息。实际上,我想使用pangoCairo将文本放在圆圈的中间,但我不知道如何使用pangoCairo来放置文本?
这是我画圆圈的代码,它有一个函数来设置圆圈的中间,但是文本没有显示在中间。
draw_stuff(canvas, cr, width, height) {
cr.setSourceRGBA(1,1,1,0.2);
cr.save ();
cr.setOperator (Cairo.Operator.CLEAR);
cr.paint ();
cr.restore ();
cr.setOperator (Cairo.Operator.OVER);
cr.scale (width, height);
cr.setLineCap (Cairo.LineCap.BUTT);
//test
cr.setLineWidth (0.08);
cr.translate (0.5, 0.5);
cr.arc (0, 0, 0.4, 0, Math.PI * 2);
cr.stroke ();
cr.setSourceRGBA(1,1,1,0.8);
cr.rotate(-Math.PI/2);
cr.save();
cr.arc (0,0, 0.4, 0, this.currentR /100 * 2 * Math.PI);
cr.stroke();
cr.setSourceRGBA(1,1,1,0.9);
cr.save();
cr.arc (0,0, 0.25, 0, 2 * Math.PI);
cr.fill();
cr.moveTo(0, 0);
cr.setSourceRGBA(0,0,0,0.9);
cr.save();
this.text_show(cr, "WoW");
cr.restore();
return true; }
update() { this.currentR = 60;
this._canvas.connect ("draw", this.draw_stuff.bind(this));
this._canvas.invalidate();}
text_show(cr, showtext, font = "DejaVuSerif Bold 16") {
let pl = PangoCairo.create_layout(cr);
pl.set_text(showtext, -1);
pl.set_font_description(Pango.FontDescription.from_string(font));
PangoCairo.update_layout(cr, pl);
let [w, h] = pl.get_pixel_size();
cr.relMoveTo(-w / 2, 0);
PangoCairo.show_layout(cr, pl);
cr.relMoveTo(w / 2, 0);}我不知道这是怎么回事?
发布于 2022-11-07 15:52:05
let [w, h] = pl.get_pixel_size();
cr.relMoveTo(-w / 2, 0);你把你的文字,大约1000像素的屏幕之外。get_pixel_size() 已记录在案 as:
pango_layout_get_size()返回由PANGO_SCALE缩放的宽度和高度。
PANGO_SCALE有值1024
因此,您需要将上面的代码更改为
let [w, h] = pl.get_pixel_size();
cr.relMoveTo(-w / 2048, 0);如果不是硬编码PANGO_SCALE的值,而是从Pango绑定中获得它,就会得到额外的分数。但是,我对gnome扩展还不太了解。这是Javascript中的代码吗?不知道。
https://stackoverflow.com/questions/74338460
复制相似问题