我已经部分成功到现在为止我可以在网格视图的字母上画一条线,但该线不是通过网格视图的视图中心.
请任何人帮助我提出宝贵的建议.
浏览下面的屏幕截图以获得清晰的想法.
编辑:我正在发布代码,以了解我是如何实现它的.
XML:
<relativeLayout xmlns:androID="http://schemas.androID.com/apk/res/androID"androID:ID="@+ID/root"androID:layout_wIDth="fill_parent"androID:layout_height="fill_parent"androID:background="#fff" ><relativeLayout androID:ID="@+ID/topbar" androID:layout_wIDth="match_parent" androID:layout_height="wrap_content" androID:layout_alignParenttop="true" androID:background="#A9E2F3" > <linearLayout androID:ID="@+ID/topbar" androID:layout_wIDth="fill_parent" androID:layout_height="wrap_content" androID:background="#336699" androID:orIEntation="horizontal" > <button androID:ID="@+ID/btn_pause" androID:layout_wIDth="wrap_content" androID:layout_height="wrap_content" androID:text="Pause" /> <Chronometer androID:ID="@+ID/chronometer1" androID:layout_wIDth="wrap_content" androID:layout_height="wrap_content" androID:text="Chronometer" /> <TextVIEw androID:ID="@+ID/counter" androID:layout_wIDth="wrap_content" androID:layout_height="wrap_content" androID:gravity="center_horizontal" androID:textSize="20sp" androID:typeface="serif" /> </linearLayout></relativeLayout><FrameLayout androID:ID="@+ID/grIDFrame" androID:layout_wIDth="fill_parent" androID:layout_height="wrap_content" androID:layout_above="@+ID/wtable" androID:layout_below="@+ID/textdisplay" > <GrIDVIEw androID:ID="@+ID/grID" androID:layout_wIDth="fill_parent" androID:layout_height="wrap_content" androID:background="#E7E8E9" androID:fitsSystemwindows="true" androID:gravity="center" androID:horizontalSpacing="10sp" androID:numColumns="10" androID:padding="1dp" androID:stretchMode="columnWIDth" androID:verticalSpacing="10sp" > </GrIDVIEw></FrameLayout><GrIDVIEw androID:ID="@+ID/wtable" androID:layout_wIDth="fill_parent" androID:layout_height="wrap_content" androID:layout_alignParentBottom="true" androID:background="#fff" androID:numColumns="3" androID:orIEntation="vertical" /> </relativeLayout>
绘图正在绘制包含网格视图的框架布局.网格视图元素通过自定义文本视图文件打印.
要绘制一条线,我使用了lineVIEw.java
import androID.content.Context;import androID.graphics.Canvas;import androID.graphics.color;import androID.graphics.Paint;import androID.util.Log;import androID.vIEw.VIEw;public class lineVIEw extends VIEw {public static final float liNE_WIDTH = 30.0f;public Paint paint = new Paint();protected Context context;public float startingX,startingY,endingX,endingY;public lineVIEw(Context context) { super(context); this.context = context; paint.setcolor(color.parsecolor("#2E9AFE")); paint.setstrokeWIDth(liNE_WIDTH); paint.setstrokeJoin(Paint.Join.ROUND); paint.setstrokeCap(Paint.Cap.ROUND); paint.setDither(true); paint.setAntiAlias(true); paint.setStyle(Paint.Style.FILL); paint.setAlpha(90);}public voID setPoints(float startX,float startY,float endX,float endY) { startingX = startX; startingY = startY; endingX = endX; endingY = endY; invalIDate();}@OverrIDepublic voID onDraw(Canvas canvas) { Log.e("liNEVIEW","startingX" + startingX + " startingY:" + startingY); Log.e("liNEVIEW","endingX" + endingX + " endingY:" + endingY); // canvas.drawline(startingX,endingY,paint); canvas.drawline(startingX,paint);}}Main Activity where logic is implemented: Written only the required logic here. newGrID = (GrIDVIEw) findVIEwByID(R.ID.grID); newGrID.setAdapter(new FormTheGrIDLetters()); newGrID.setontouchListener(new OntouchListener() { @OverrIDe public boolean ontouch(VIEw v,MotionEvent event) { // if (mp.isPlaying()) { // mp.stop(); // } int action = event.getActionMasked(); switch (action) { case MotionEvent.ACTION_DOWN: case MotionEvent.ACTION_MOVE: case MotionEvent.ACTION_UP: // data PaintVIEwHolder newPaint = new PaintVIEwHolder(); newPaint.Drawline = new lineVIEw(wordsearchActivity.this); grIDFrame.addVIEw(newPaint.Drawline); builDWord = new StringBuilder(); int x = (int) event.getX(); int y = (int) event.getY(); // test = new lineVIEw(wordsearchActivity.this); int position = newGrID.pointToposition(x,y); Point one,two; if (position != GrIDVIEw.INVALID_position) { v.getParent().requestdisallowIntercepttouchEvent(true); cellVIEw = (TextVIEw) newGrID.getChildAt(position); String a = cellVIEw.getText().toString(); // Log.v(">>>>><<<<<<<????????",a.toString()); switch (action) { case MotionEvent.ACTION_DOWN: startX = event.getX(); startY = event.getY(); break; case MotionEvent.ACTION_MOVE: break; case MotionEvent.ACTION_UP: // Checking the List for formed word ; //if found that is painted for (int i1 = 0; i1 < Ans.size(); i1++) { if (formeDWord.equals(Ans.get(i1))) { answerAdapter.notifyDataSetChanged(); newPaint.Drawline.setPoints(startX,startY,x,y); // Painted the letters by passing starting and ending points } } break; } } else { if (mSelecting) { mSelecting = false; } } break; case MotionEvent.ACTION_CANCEL: mSelecting = false; break; } return true; } });解决方法 我不知道你是否解决了这个问题,但无论如何我会回答可能有这些问题的人.收到有效位置后,您可以获得视图的中心,并可以将这些值设置为绘制的开始.
像这样:
if (position != GrIDVIEw.INVALID_position) { MyList.add(position); v.getParent().requestdisallowIntercepttouchEvent(true); TextVIEw cellVIEw = (TextVIEw) grIDVIEw.getChildAt(position); centreX = cellVIEw.getX() + cellVIEw.getWIDth() / 2; centreY = cellVIEw.getY() + cellVIEw.getHeight() / 2; switch (event.getAction()) { case MotionEvent.ACTION_DOWN: newPaint.Drawline.touch_start(x,y,centreX,centreY);
我试过这个代码,它正在运行.我不认为你需要了,但我最近加入了这个网站,所以也许它会帮助其他人.如果你愿意,我可以发布更多代码
newPaint.Drawline.touch_start(x,centreY);
是这个问题的诀窍.希望这可以帮助.
总结以上是内存溢出为你收集整理的无法通过Android中的textview单元格正确地在gridview元素上绘制线条全部内容,希望文章能够帮你解决无法通过Android中的textview单元格正确地在gridview元素上绘制线条所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)