小编Les*_*zek的帖子

如何垂直对齐文本?

目标:纯画布上的Android> = 1.6.

假设我想编写一个绘制(宽度,高度)大红色矩形的函数,然后在里面绘制一个黑色的Hello World文本.我希望文本在视觉上位于矩形的中心.所以让我们试试:

void drawHelloRectangle(Canvas c, int topLeftX, 
        int topLeftY, int width, int height) {
    Paint mPaint = new Paint();
    // height of 'Hello World'; height*0.7 looks good
    int fontHeight = (int)(height*0.7);

    mPaint.setColor(COLOR_RED);
    mPaint.setStyle(Style.FILL);
    c.drawRect( topLeftX, topLeftY, topLeftX+width, topLeftY+height, mPaint);

    mPaint.setTextSize(fontHeight);
    mPaint.setColor(COLOR_BLACK);
    mPaint.setTextAlign(Align.CENTER);
    c.drawText( "Hello World", topLeftX+width/2, ????, mPaint);
}
Run Code Online (Sandbox Code Playgroud)

现在我不知道在标记为drawText的参数中放什么????,即我不知道如何垂直对齐文本.

就像是

???? = topLeftY + height/2 + fontHeight/2 - fontHeight/8;

似乎或多或少有效,但必须有更好的方法.

java android canvas drawtext

46
推荐指数
6
解决办法
4万
查看次数

Linux:编写一个"控制"shell的C程序

假设我们在终端上运行了一个shell,比方说/ dev/pts/1.shell已经运行,我们无法重新启动它.

现在我们要编写一个"控制"shell的C程序,即它本身会为用户提供类似shell的接口,读取用户的输入,将其传递给/ dev/pts/1上的真实shell,它执行它,读取shell的输出并将其打印回用户.

我知道如何完成这项任务的一半:我知道如何收集用户的输入并将此输入注入"真实shell":

#include <fcntl.h>
#include <sys/ioctl.h>
#include <stdio.h>

#define SIZE 100

int main(int argc, char** argv)
{
if( argc>1 )
  {
  int tty = open( argv[1], O_WRONLY|O_NONBLOCK);

  if( tty!=-1 )
    {
    char *buf,buffer[SIZE+1];

    while(1)
      {
      printf("> ");
      fgets( buffer, SIZE, stdin );
      if( buffer[0]=='q' && buffer[1]=='u' && buffer[2]=='i' && buffer[3]=='t' ) break;
      for(buf=buffer; *buf!='\0'; buf++ ) ioctl(tty, TIOCSTI, buf);
      }

    close(tty);
    }
  else printf("Failed to open terminal %s\n", argv[1]);
  }

return 0;
}
Run Code Online (Sandbox Code Playgroud)

上面将把你的输入传递给在终端中运行的shell(在第一个参数中给出它的名字)并让shell执行它.但是,我现在不知道如何读取shell的输出.

有小费吗?

c linux shell controls

14
推荐指数
2
解决办法
1685
查看次数

分析图形着色器

相当长一段时间以来,我一直在避免在着色器代码中进行分支,而不是

float invert_value(in float value)
{
if(value == 0.0)
    return 0.0;
else
    return 1.0 / value;
}
Run Code Online (Sandbox Code Playgroud)

像这样编写“聪明”的代码

float invert_value_ifless(in float value)
{
float sign_value = sign(value);
float sign_value_squared = sign_value*sign_value;
return sign_value_squared / ( value + sign_value_squared - 1.0); 
}
Run Code Online (Sandbox Code Playgroud)

这完全返回第一个函数的功能,并且没有分支,因此速度更快。

或者是吗?我这是在跟鬼打架吗?

如何分析图形着色器以提高速度?我对最近的移动平台(Android)最感兴趣,但任何有关图形分析的建议都将受到欢迎!

opengl glsl glsles

5
推荐指数
1
解决办法
2218
查看次数

标签 统计

android ×1

c ×1

canvas ×1

controls ×1

drawtext ×1

glsl ×1

glsles ×1

java ×1

linux ×1

opengl ×1

shell ×1