Android實現梯形TextView效果_第1頁
Android實現梯形TextView效果_第2頁
Android實現梯形TextView效果_第3頁
Android實現梯形TextView效果_第4頁
Android實現梯形TextView效果_第5頁
全文預覽已結束

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

第Android實現梯形TextView效果@Override

protectedvoidonLayout(booleanchanged,intleft,inttop,intright,intbottom){

super.onLayout(changed,left,top,right,bottom);

width=getWidth();

height=getHeight();

Log.v(TAG,"widthheight-"+width+""+height);

@Override

protectedvoidonDraw(Canvascanvas){

super.onDraw(canvas);

Log.v(TAG,"onDraw");

if(isLeft){

linePath.moveTo(0+lineOffset,0+lineOffset);

linePath.lineTo(width,0+lineOffset);

linePath.lineTo((int)(width-offsetScale*height),height-lineOffset);

linePath.lineTo(0+lineOffset,height-lineOffset);

linePath.close();

setTextAlignment(TEXT_ALIGNMENT_TEXT_START);

canvas.drawPath(linePath,paint);

canvas.drawText(textContent==null"":textContent,

getPaddingStart()+lineOffset,

height/2+textOffset,textPaint);

}else{

linePath.moveTo(0+lineOffset+offsetScale*height,0+lineOffset);

linePath.lineTo(width-lineOffset,0+lineOffset);

linePath.lineTo(width-lineOffset,height-lineOffset);

linePath.lineTo(0,height-lineOffset);

linePath.close();

setTextAlignment(TEXT_ALIGNMENT_TEXT_END);

canvas.drawPath(linePath,paint);

canvas.drawText(textContent==null"":textContent,

getWidth()-lineOffset-getPaddingEnd()-getDrawTextWidth(textPaint,textContent),

height/2+textOffset,textPaint);

@Override

publicbooleandispatchTouchEvent(MotionEventevent){

if(event.getAction()==MotionEvent.ACTION_DOWN){

if(!isInRegion(event)){//點擊的點的位置不在范圍內則不響應

returnfalse;

returnsuper.dispatchTouchEvent(event);

*判斷點擊的位置是否在要求的范圍內

*@paramevent

*@return

publicbooleanisInRegion(MotionEventevent){

RectFrectF=newRectF();

linePputeBounds(rectF,true);

mRegion.setPath(linePath,newRegion((int)rectF.left,(int)rectF.top,(int)rectF.right,(int)rectF.bottom));

returnmRegion.contains((int)event.getX(),(int)event.getY());

*獲取要畫的字符串的寬度

*@parampaint

*@paramtextContent

*@return

privateintgetDrawTextWidth(Paintpaint,StringtextContent){

floattotalWidth=0f;

if(textContent!=nulltextContent.length()0){

intlen=textContent.length();

float[]widths=newfloat[len];

paint.getTextWidths(textContent,widths);

for(intj=0;jlen;j++){

totalWidth+=widths[j];

return(int)Math.ceil(totalWidth);

*@paramdpValue(DisplayMetrics類中屬性density)

*@return

privateintdp2px(Contextcontext,floatdpValue){

finalfloatscale=context.getResources().getDisplayMetrics().density;

return(int)(dpValue*scale+0.5f);

publicvoidsetTextContent(StringtextContent){

this.textContent=textContent;

invalidate();

publicvoidsetMSelected(booleanisSelected){

textPaint.setColor(isSelectedColor.WHITE:selectedColor);

paint.setStyle(isSelectedPaint.Style.FILL_AND_STROKE:Paint.Style.STROKE);

this.isSelected=isSelected;

invalidate();

@Override

publicbooleanisSelected(){

returnisSelected;

}

要點分析

1.背景與文本內容的繪制

計算好四個點的位置連線,TextView默認的文本內容則設置為空字符串,采用drawText的方式來實現文本的顯示。需要注意的是計算文本的字號長度大小、顏色以及位于整個view的位置、偏移量等。

2.梯形范圍內外的點擊事件處理

依照于設計,梯形內的點擊才有響應,則要計算點擊的位置是否在梯形內,然后通過dispatchTouchEvent來做事件的分發。

*判斷點擊的位置是否在要求的范圍內

*@paramevent

*@return

publicbooleanisInRegion(MotionEventevent){

RectFrectF=newRectF();

linePputeBounds(rectF,true);

mRegion.setPath(linePath,newRegion((int)rectF.left,(int)rectF.top,(int)rectF.right,(int)rectF.bottom));

returnmRegion.contains((int)eve

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論