android自定義控件實(shí)現(xiàn)簡(jiǎn)易時(shí)間軸(1)
本文實(shí)例為大家分享了android自定義控件實(shí)現(xiàn)簡(jiǎn)易時(shí)間軸的具體代碼,供大家參考,具體內(nèi)容如下
之前項(xiàng)目需要寫一個(gè)消費(fèi)記錄,類似于時(shí)間軸似的控件,自身在自定義控件這里不咋地(…),最后搞了一個(gè)這個(gè)demo
效果圖:
這里就是繪制圓和上下兩條線
1.資源文件,定義一些基本的屬性:
<?xml version="1.0" encoding="utf-8"?> <resources> ? ? <attr name="textSize" format="dimension" /> ? ? <attr name="textColor" format="color" /> ? ? <attr name="textTitle" format="string" /> ? ? <attr name="borderColor" format="color" /> ? ? <attr name="borderWidth" format="dimension" /> ? ? <attr name="lineColor" format="color" /> ? ? <attr name="lineWidth" format="dimension" /> ? ? <attr name="bgColor" format="color" /> ? ? <attr name="mRadius" format="dimension"/> ? ? <declare-styleable name="CustomCicleView"> ? ? ? ? <attr name="textSize" /> ? ? ? ? <attr name="textColor" /> ? ? ? ? <attr name="textTitle" /> ? ? ? ? <attr name="lineColor" /> ? ? ? ? <attr name="lineWidth" /> ? ? ? ? <attr name="bgColor" /> ? ? ? ? <attr name="borderColor" /> ? ? ? ? <attr name="borderWidth" /> ? ? ? ? ? ?<attr name="mRadius" /> ? ? </declare-styleable> </resources>
2.獲取屬性:
int attr=a.getIndex(i); ? ? ? ? switch (attr) { ? ? ? ? ? ? case R.styleable.CustomCicleView_textSize: ? ? ? ? ? ? ? ? ? // 默認(rèn)設(shè)置為16sp,TypeValue也可以把sp轉(zhuǎn)化為px ? ? ? ? ? ? ? ? ? mTextSize = a.getDimensionPixelSize(attr, (int) TypedValue.applyDimension( ? ? ? ? ? ? ? ? ? ? ? ? ? TypedValue.COMPLEX_UNIT_PX, 14, getResources().getDisplayMetrics()));? ? ? ? ? ? ? ? ? break; ? ? ? ? ? ? case R.styleable.CustomCicleView_textColor: ? ? ? ? ? ? ? ? mTextColor=a.getColor(attr, Color.BLACK); ? ? ? ? ? ? ? ? break; ? ? ? ? ? ? case R.styleable.CustomCicleView_lineWidth: ? ? ? ? ? ? ? ? mLineWidth= a.getDimensionPixelSize(attr, (int) TypedValue.applyDimension( ? ? ? ? ? ? ? ? ? ? ? ? ? TypedValue.COMPLEX_UNIT_PX, 2, getResources().getDisplayMetrics())); ? ? ? ? ? ? ? ? ? break; ? ? ? ? ? ? case R.styleable.CustomCicleView_lineColor: ? ? ? ? ? ? ? ? mLineColor=a.getColor(attr, lineColr); ? ? ? ? ? ? ? ? break; ? ? ? ? ? ? case R.styleable.CustomCicleView_borderWidth: ? ? ? ? ? ? ? ? mBorderWidth= a.getDimensionPixelSize(attr, (int) TypedValue.applyDimension( ? ? ? ? ? ? ? ? ? ? ? ? ? TypedValue.COMPLEX_UNIT_PX, 2, getResources().getDisplayMetrics())); ? ? ? ? ? ? ? ? ? break; ? ? ? ? ? ? case R.styleable.CustomCicleView_borderColor: ? ? ? ? ? ? ? ? mBorderColor=a.getColor(attr, borderColor); ? ? ? ? ? ? ? ? break; ? ? ? ? ? ? case R.styleable.CustomCicleView_bgColor: ? ? ? ? ? ? ? ? mBgColor=a.getColor(attr, bgColor); ? ? ? ? ? ? ? ? break; ? ? ? ? ? ? }
這里主要釋放資源方便回收:
a.recycle(); //官方API的解釋是:給回一個(gè)先前的提取的數(shù)組,為以后復(fù)用,,就是當(dāng)前的對(duì)象回收,下次要用的時(shí)候就不用重新再new一個(gè)新的對(duì)象了,直接從它的回收池里面拿就行。 public void recycle (): Give back a previously retrieved array, for later re-use
3.重要繪制代碼:
?super.onDraw(canvas); ? ? ? int centre = getWidth() / 2; // 獲取圓心的x坐標(biāo) ? ? ? ? //半徑比較 ? ? ? ? int mixWidth=getMeasuredWidth()>getMeasuredHeight()?getMeasuredHeight():getMeasuredWidth(); ? ? ? ? mRadius =mRadius>(mixWidth)?(mixWidth):mRadius; ? ? ? ? mBorderWidth =mRadius/2>=(mBorderWidth)?(mBorderWidth):mRadius/10;//最終的效果要不是自己設(shè)置的要不就是半徑的1/5 ? ? ? ? int radius = mRadius/2 - mBorderWidth / 2;// 半徑 ? ? ? ? mLineHeight=Math.abs(getHeight()/2-radius);//這個(gè)地方要判斷設(shè)置正負(fù) ? ? ? ? if(lineLocation!=-1){ ? ? ? ? ? ? drawLine(canvas,centre); ? ? ? ? } ? ? ? ? //繪制背景 ? ? ? ? bgPaint.setColor(Color.parseColor("#00000000")); ? ? ? ? bgPaint.setTextSize(mTextSize); ? ? ? ? canvas.drawRect(0, 0, getMeasuredWidth(), getMeasuredHeight(), bgPaint); ? ? ? ? //繪制圓 ? ? ? ? bgPaint.setAntiAlias(true); // 消除鋸齒 ? ? ? ? bgPaint.setColor(mBgColor); ? ? ? ? bgPaint.setStyle(Paint.Style.FILL); // 設(shè)置實(shí)心 ? ? ? ? canvas.drawCircle(centre, centre, radius, bgPaint); ? ? ? ? //繪制圓環(huán) ? ? ? ? borderPaint.setStrokeWidth(mBorderWidth); // 設(shè)置圓環(huán)的寬度 ? ? ? ? borderPaint.setAntiAlias(true); // 消除鋸齒 ? ? ? ? if (mBorderColor != 0) { ? ? ? ? ? ? borderPaint.setColor(mBorderColor); ? ? ? ? } else { ? ? ? ? ? ? borderPaint.setColor(borderColor); ? ? ? ? } ? ? ? ? borderPaint.setStyle(Paint.Style.STROKE); // 設(shè)置實(shí)心 ? ? ? ? canvas.drawCircle(centre,centre, radius - mBorderWidth / 2+mLineWidth/2, borderPaint); ? ? ? ? //繪制文本 ? ? ? ? bgPaint.setColor(mTextColor); ? ? ? ? textPaint.getTextBounds(mTextTitle, 0, mTextTitle.length(), textRect); ? ? ? ? canvas.drawText(mTextTitle, centre -textRect.width()/2, centre ?+ textRect.height() / 2, bgPaint);
這里給了一個(gè)int值來(lái)判斷當(dāng)前需要繪制那個(gè)位置的line;值是0只需繪制 上方line,值是 1只需繪制下方line,值是2同事繪制上下方line,值是-1不需繪制line;這個(gè)值由用戶使用的時(shí)候傳遞過(guò)來(lái)這樣就可以繪制對(duì)應(yīng)的line
?//0 ?上方 1 ?下方 2 ?上下兩個(gè) ? ? private void drawLine(Canvas canvas, float centre) { ? ? ? ? linePaint.setColor(borderColor); ? ? ? ? linePaint.setStrokeWidth(mLineWidth); ? ? ? ? if (lineLocation == 0) { // ? ? ? ? ?canvas.drawLine(centre, 0.5F*centre-mLineHeight, centre, centre, linePaint);? ? ? ? ? ? ? canvas.drawLine(centre, 0, centre, mLineHeight*2, linePaint); ? ? ? ? } else if (lineLocation == 1) { ? ? ? ? ? ? canvas.drawLine(centre, centre, centre, centre * 2F + mLineHeight, linePaint); ? ? ? ? } else if (lineLocation == 2) { // ? ? ? ? ? ?canvas.drawLine(centre, mRadius * 0.5F - mLineHeight-mBorderWidth, centre, mLineHeight, linePaint); ? ? ? ? ? ? canvas.drawLine(centre, 0, centre, mLineHeight*2, linePaint); ? ? ? ? ? ? canvas.drawLine(centre, centre, centre, centre * 2F + mLineHeight, linePaint); ? ? ? ? } ? ? }
4.使用
這里的使用有兩種,一種是在xml中直接布局,設(shè)置屬性,一種是在代碼中初始化然后根據(jù)提供的set方法來(lái)設(shè)置相應(yīng)的屬性。
在你布局中使用的時(shí)候要加上
xmlns:app=”http://schemas.android.com/apk/res/com.example.circleview”
com.example.circleview:是包名
這樣你就可以設(shè)置這個(gè)控件的屬性了
<com.example.circleview.CircleImg ? ? ? ? android:id="@+id/itemImg" ? ? ? ? android:layout_width="100dp" ? ? ? ? android:layout_height="100dp" ? ? ? ? android:layout_margin="2dp" ? ? ? ? app:bgColor="#f88" ? ? ? ? app:borderColor="#138ddd" ? ? ? ? app:textColor="#fff" ? ? ? ? app:textSize="12dp" />
最終效果:
基本的一個(gè)圓就好了,現(xiàn)在來(lái)實(shí)現(xiàn)開始的時(shí)候的效果圖,基本就是用listView實(shí)現(xiàn):
布局文件
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" ? ? xmlns:tools="http://schemas.android.com/tools" ? ? xmlns:app="http://schemas.android.com/apk/res/com.example.circleview" ? ? android:layout_width="match_parent" ? ? android:layout_height="match_parent" ? ? android:layout_margin="5dp" ? ? android:orientation="vertical" ? ? tools:context="com.example.circleview.MainActivity" > ? ? <ListView ? ? ? ? android:id="@+id/listView" ? ? ? ? android:layout_width="wrap_content" ? ? ? ? android:layout_height="wrap_content" ? ? ? ? android:divider="#00000000" ? ? ? ? android:dividerHeight="0dp" ? ? ? > ? ? </ListView> </LinearLayout>
MainActivity.java:
public class MainActivity extends Activity { ? ? private List<String> list=new ArrayList<String>(); ? ? ListView listView; ? ? @Override ? ? protected void onCreate(Bundle savedInstanceState) { ? ? ? ? super.onCreate(savedInstanceState); ? ? ? ? setContentView(R.layout.activity_main); ? ? ? ? initData(); ? ? ? ? listView=(ListView) findViewById(R.id.listView); ? ? ? ? listView.setAdapter(new TimeLineAdapter(list, this)); ? ? } ? ? private void initData() { ? ? ? ? for (int i =11; i >1; i--) {//時(shí)間從小到大 ? ? ? ? list.add("05/"+i); ? ? ? ? ? } ? ? } }
Adapter:
public class TimeLineAdapter extends BaseAdapter { ? ? private static final int[] COLOR = new int[] { ? ? ? ? ? ? ? 0xff33b5e5, 0xffaa66cc, 0xff99cc00, 0xffffbb33, 0xffff4444,0xff009933,0xffff9988, ?0xffffddcc,0xff00ffff,0xffffff00 ? ? ? ? };? ? ? private List<String> list; ? ? private Context context; ? ? private ViewHolder holder; ? ? public TimeLineAdapter(List<String> list, Context context) { ? ? ? ? super(); ? ? ? ? this.list = list; ? ? ? ? this.context = context; ? ? } ? ? @Override ? ? public int getCount() { ? ? ? ? // TODO Auto-generated method stub ? ? ? ? return list.size(); ? ? } ? ? @Override ? ? public Object getItem(int position) { ? ? ? ? // TODO Auto-generated method stub ? ? ? ? return list.get(position); ? ? } ? ? @Override ? ? public long getItemId(int position) { ? ? ? ? return position; ? ? } ? ? @Override ? ? public View getView(int position, View convertView, ViewGroup parent) { ? ? ? ? ?int type = getItemViewType(position); ? ? ? ? if(convertView==null){ ? ? ? ? ? ? convertView=View.inflate(context, R.layout.item,null); ? ? ? ? ? ? holder=new ViewHolder(); ? ? ? ? ? ? convertView.setTag(holder); ? ? ? ? ? ? holder.img=(CircleImg) convertView.findViewById(R.id.itemImg); ? ? ? ? ? ? holder.item=(TextView) convertView.findViewById(R.id.itemText); ? ? ? ? }else{ ? ? ? ? ? ? holder=(ViewHolder) convertView.getTag(); ? ? ? ? } ? ? ? ? holder.img.setBgAndBorderColor(COLOR[position%10]); ? ? ? ? holder.img.invalidate();//記得重繪 ? ? ? ? holder.img.setLineLocation(type); ? ? ? ? holder.img.setmTextTitle(list.get(position)); ? ? ? ? holder.item.setText("哈哈哈哈哈哈哈哈"); ? ? ? ? return convertView; ? ? } ? ? @Override ? ? public int getItemViewType(int position) { ? ? ? ? ? final int size = list.size() - 1; ? ? ? ? ? ? if (size == 0) ? ? ? ? ? ? ? ? return ItemType.ATOM; ? ? ? ? ? ? else if (position == 0) ? ? ? ? ? ? ? ? return ItemType.FOOTER; ? ? ? ? ? ? else if (position == size) ? ? ? ? ? ? ? ? return ItemType.HEADER; ? ? ? ? ? ? else return ItemType.NORMAL; ? ? } ? ? class ViewHolder{ ? ? ? ? TextView item; ? ? ? ? CircleImg img; ? ? } }
這里繪制上下line的時(shí)候是通過(guò)getItemViewType()返回的view id值來(lái)判斷的,ItemType中有四個(gè)變量:
public final static int NORMAL = 2; ?//表示繪制上下方 public final static int HEADER = 0; ?//表示繪制下方 public final static int FOOTER = 1; ?//表示繪制上方 public final static int ATOM = -1; ? //表示不繪制
然后通過(guò)holder.img.setLineLocation(type);來(lái)設(shè)置當(dāng)前繪制的line。
CIcleVIew.java下:
/** ?* Created by yqy on 2016/11/28. ?*/ public class CircleImg extends View { ? ? //畫筆 ? ? private Paint bgPaint, linePaint, borderPaint,textPaint; ? ? private Rect bgRect, textRect; ? ? //基本屬性 ? ? private int mTextSize; ? ? private int mTextColor; ? ? private String mTextTitle; ? ? private int lineColr = Color.parseColor("#AAAAAA"); ? ? private int borderColor = Color.parseColor("#AAAAAA"); ? ? private int bgColor = Color.parseColor("#138DDD"); ? ? private int mBorderColor; ? ? private int mBorderWidth = 2; ? ? private int mLineColor; ? ? private int mLineWidth = 2; ? ? private int mLineHeight; ? ? private int mBgColor; ? ? //line繪制 ? ? private int lineLocation = -1;//0 ?上方 1 ?下方 2 ?上下兩個(gè) ? ? private int mRadius = 40; ? ? public CircleImg(Context context) { ? ? ? ? this(context, null); ? ? } ? ? //設(shè)置line的位置 0 ?上方 1 ?下方 2 ?上下兩個(gè) ? ? public void setLineLocation(int lineLocation) { ? ? ? ? this.lineLocation = lineLocation; ? ? } ? ? //設(shè)置純色的整圓形,包括背景 ? ? public void setBgAndBooderCOlor(int color) { ? ? ? ? this.mBorderColor = color; ? ? ? ? this.mBgColor = color; ? ? } ? ? public void setmTextTitle(String mTextTitle) { ? ? ? ? this.mTextTitle = mTextTitle; ? ? } ? ? public void setmRadius(int mRadius) { ? ? ? ? this.mRadius = mRadius; ? ? } ? ? public CircleImg(Context context, AttributeSet attrs) { ? ? ? ? this(context, attrs, 0); ? ? ? ? // TODO Auto-generated constructor stub ? ? } ? ? public CircleImg(Context context, AttributeSet attrs, int defStyle) { ? ? ? ? super(context, attrs, defStyle); ? ? ? ? TypedArray a = context.getTheme().obtainStyledAttributes(attrs, R.styleable.CustomCicleView, defStyle, 0); ? ? ? ? int n = a.getIndexCount(); ? ? ? ? for (int i = 0; i < n; i++) { ? ? ? ? ? ? int attr = a.getIndex(i); ? ? ? ? ? ? switch (attr) { ? ? ? ? ? ? ? ? case R.styleable.CustomCicleView_textSize: ? ? ? ? ? ? ? ? ? ? // 默認(rèn)設(shè)置為16sp,TypeValue也可以把sp轉(zhuǎn)化為px ? ? ? ? ? ? ? ? ? ? mTextSize = a.getDimensionPixelSize(attr, (int) TypedValue.applyDimension( ? ? ? ? ? ? ? ? ? ? ? ? ? ? TypedValue.COMPLEX_UNIT_PX, 14, getResources().getDisplayMetrics())); ? ? ? ? ? ? ? ? ? ? break; ? ? ? ? ? ? ? ? case R.styleable.CustomCicleView_textColor: ? ? ? ? ? ? ? ? ? ? mTextColor = a.getColor(attr, Color.BLACK); ? ? ? ? ? ? ? ? ? ? break; ? ? ? ? ? ? ? ? case R.styleable.CustomCicleView_textTitle: ? ? ? ? ? ? ? ? ? ? mTextTitle = a.getString(attr); ? ? ? ? ? ? ? ? ? ? break; ? ? ? ? ? ? ? ? case R.styleable.CustomCicleView_lineWidth: ? ? ? ? ? ? ? ? ? ? mLineWidth = a.getDimensionPixelSize(attr, (int) TypedValue.applyDimension( ? ? ? ? ? ? ? ? ? ? ? ? ? ? TypedValue.COMPLEX_UNIT_PX, 2, getResources().getDisplayMetrics())); ? ? ? ? ? ? ? ? ? ? break; ? ? ? ? ? ? ? ? case R.styleable.CustomCicleView_lineColor: ? ? ? ? ? ? ? ? ? ? mLineColor = a.getColor(attr, lineColr); ? ? ? ? ? ? ? ? ? ? break; ? ? ? ? ? ? ? ? case R.styleable.CustomCicleView_mRadius: ? ? ? ? ? ? ? ? ? ? mRadius=a.getInt(attr,40); ? ? ? ? ? ? ? ? ? ? break; ? ? ? ? ? ? ? ? case R.styleable.CustomCicleView_borderWidth: ? ? ? ? ? ? ? ? ? ? mBorderWidth = a.getDimensionPixelSize(attr, (int) TypedValue.applyDimension( ? ? ? ? ? ? ? ? ? ? ? ? ? ? TypedValue.COMPLEX_UNIT_PX, 2, getResources().getDisplayMetrics())); ? ? ? ? ? ? ? ? ? ? break; ? ? ? ? ? ? ? ? case R.styleable.CustomCicleView_borderColor: ? ? ? ? ? ? ? ? ? ? mBorderColor = a.getColor(attr, borderColor); ? ? ? ? ? ? ? ? ? ? break; ? ? ? ? ? ? ? ? case R.styleable.CustomCicleView_bgColor: ? ? ? ? ? ? ? ? ? ? mBgColor = a.getColor(attr, bgColor); ? ? ? ? ? ? ? ? ? ? break; ? ? ? ? ? ? } ? ? ? ? } ? ? ? ? a.recycle(); ? ? ? ? bgPaint = new Paint(); ? ? ? ? borderPaint = new Paint(); ? ? ? ? linePaint = new Paint(); ? ? ? ? textPaint = new Paint(); ? ? ? ? textRect = new Rect(); ? ? ? ? textPaint.setTextSize(mTextSize); ? ? } ? ? //暫時(shí)不計(jì)算 ? ? @Override ? ? protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { ? ? ? ? super.onMeasure(widthMeasureSpec, heightMeasureSpec); ? ? ? ? int w = getPaddingLeft() + getPaddingRight(); ? ? ? ? int h = getPaddingTop() + getPaddingBottom(); ? ? ? ? if (bgPaint != null) { ? ? ? ? ? ? w += mRadius; ? ? ? ? ? ? h += mRadius; ? ? ? ? } ? ? ? ? w = Math.max(w, getMeasuredWidth()); ? ? ? ? h = Math.max(h, getMeasuredHeight()); ? ? ? ? int widthSize = resolveSizeAndState(w, widthMeasureSpec, 0); ? ? ? ? int heightSize = resolveSizeAndState(h, heightMeasureSpec, 0); ? ? ? ? setMeasuredDimension(widthSize, heightSize); ? ? } ? ? @Override ? ? protected void onDraw(Canvas canvas) { ? ? ? ? super.onDraw(canvas); ? ? ? ?int centre = getWidth() / 2; // 獲取圓心的x坐標(biāo) ? ? ? ? int radius = mRadius - mBorderWidth / 2;// 半徑 ? ? ? ? mLineHeight=getHeight()/2-radius;//這個(gè)地方要判斷設(shè)置正負(fù) ? ? ? ? if(lineLocation!=-1){ ? ? ? ? ? ? drawLine(canvas,centre); ? ? ? ? } ? ? ? ? //繪制背景 ? ? ? ? bgPaint.setColor(Color.parseColor("#00000000")); ? ? ? ? bgPaint.setTextSize(mTextSize); ? ? ? ? canvas.drawRect(0, 0, getMeasuredWidth(), getMeasuredHeight(), bgPaint); ? ? ? ? //繪制圓 ? ? ? ? bgPaint.setAntiAlias(true); // 消除鋸齒 ? ? ? ? bgPaint.setColor(mBgColor); ? ? ? ? bgPaint.setStyle(Paint.Style.FILL); // 設(shè)置實(shí)心 ? ? ? ? canvas.drawCircle(centre, centre, radius, bgPaint); ? ? ? ? //繪制圓環(huán) ? ? ? ? borderPaint.setStrokeWidth(mBorderWidth); // 設(shè)置圓環(huán)的寬度 ? ? ? ? borderPaint.setAntiAlias(true); // 消除鋸齒 ? ? ? ? if (mBorderColor != 0) { ? ? ? ? ? ? borderPaint.setColor(mBorderColor); ? ? ? ? } else { ? ? ? ? ? ? borderPaint.setColor(borderColor); ? ? ? ? } ? ? ? ? borderPaint.setStyle(Paint.Style.STROKE); // 設(shè)置實(shí)心 ? ? ? ? canvas.drawCircle(centre,centre, radius - mBorderWidth / 2+mLineWidth/2, borderPaint); ? ? ? ? //繪制文本 ? ? ? ? bgPaint.setColor(mTextColor); ? ? ? ? textPaint.getTextBounds(mTextTitle, 0, mTextTitle.length(), textRect); ? ? ? ? canvas.drawText(mTextTitle, centre -textRect.width()/2, centre ?+ textRect.height() / 2, bgPaint); ? ? } ? ? //0 ?上方 1 ?下方 2 ?上下兩個(gè) ? ? private void drawLine(Canvas canvas, float centre) { ? ? ? ? linePaint.setColor(borderColor); ? ? ? ? linePaint.setStrokeWidth(mLineWidth); ? ? ? ? if (lineLocation == 0) { ? ? ? ? ? ? canvas.drawLine(centre, centre, centre, centre * 2F + mLineHeight, linePaint); ? ? ? ? } else if (lineLocation == 1) { ? ? ? ? ? ? canvas.drawLine(centre, 0, centre, mLineHeight*2, linePaint); ? ? ? ? } else if (lineLocation == 2) { ? ? ? ? ? ? canvas.drawLine(centre, 0, centre, mLineHeight*2, linePaint); ? ? ? ? ? ? canvas.drawLine(centre, centre, centre, centre * 2F + mLineHeight, linePaint); ? ? ? ? } ? ? } }
styleable.xml:
<?xml version="1.0" encoding="utf-8"?> <resources> ? ? <attr name="textSize" format="dimension" /> ? ? <attr name="textColor" format="color" /> ? ? <attr name="textTitle" format="string" /> ? ? <attr name="borderColor" format="color" /> ? ? <attr name="borderWidth" format="dimension" /> ? ? <attr name="lineColor" format="color" /> ? ? <attr name="lineWidth" format="dimension" /> ? ? <attr name="bgColor" format="color" /> ? ? <attr name="mRadius" format="dimension"/> ? ? <declare-styleable name="CustomCicleView"> ? ? ? ? <attr name="textSize" /> ? ? ? ? <attr name="textColor" /> ? ? ? ? <attr name="textTitle" /> ? ? ? ? <attr name="lineColor" /> ? ? ? ? <attr name="lineWidth" /> ? ? ? ? <attr name="bgColor" /> ? ? ? ? <attr name="borderColor" /> ? ? ? ? <attr name="borderWidth" /> ? ? ? ? ? ?<attr name="mRadius" /> ? ? </declare-styleable> </resources>
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- android自定義控件實(shí)現(xiàn)簡(jiǎn)易時(shí)間軸(2)
- Android recyclerview實(shí)現(xiàn)縱向虛線時(shí)間軸的示例代碼
- Android自定義控件實(shí)現(xiàn)時(shí)間軸
- Android使用自定義View實(shí)現(xiàn)橫行時(shí)間軸效果
- Android自定義view仿淘寶快遞物流信息時(shí)間軸
- Android實(shí)現(xiàn)快遞物流時(shí)間軸效果
- Android實(shí)現(xiàn)列表時(shí)間軸
- Android自定義指示器時(shí)間軸效果實(shí)例代碼詳解
- 教你3分鐘了解Android 簡(jiǎn)易時(shí)間軸的實(shí)現(xiàn)方法
- Android自定義View實(shí)現(xiàn)垂直時(shí)間軸布局
相關(guān)文章
Android XRecyclerView最簡(jiǎn)單的item點(diǎn)擊事件處理
這篇文章主要為大家詳細(xì)介紹了Android XRecyclerView最簡(jiǎn)單的item點(diǎn)擊事件處理,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-12-12Android自定義View實(shí)現(xiàn)可以拖拽的GridView
這篇文章主要為大家詳細(xì)介紹了Android自定義View實(shí)現(xiàn)可以拖拽的GridView,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-06-06Android中實(shí)現(xiàn)TCP和UDP傳輸實(shí)例
這篇文章主要介紹了Android中實(shí)現(xiàn)TCP和UDP傳輸實(shí)例,本文給出了TCP服務(wù)器端代碼、TCP客戶端代碼、UDP服務(wù)器端代碼、UDP客戶端代碼等代碼實(shí)例,需要的朋友可以參考下2015-03-03Android學(xué)習(xí)筆記-保存文件(Saving Files)
這篇文章主要介紹了Android中保存文件(Saving Files)的方法,需要的朋友可以參考下2014-10-10基于popupWindow實(shí)現(xiàn)懸浮半透明效果
這篇文章主要為大家詳細(xì)介紹了基于popupWindow實(shí)現(xiàn)懸浮半透明效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-04-04Android DigitalClock組件用法實(shí)例
這篇文章主要介紹了Android DigitalClock組件用法,結(jié)合實(shí)例形式分析了DigitalClock組件的布局調(diào)用技巧,非常簡(jiǎn)單實(shí)用,需要的朋友可以參考下2016-01-01android studio與手機(jī)連接調(diào)試步驟詳解
這篇文章主要為大家詳細(xì)介紹了android studio與手機(jī)連接調(diào)試步驟,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-07-07Android編程使用android-support-design實(shí)現(xiàn)MD風(fēng)格對(duì)話框功能示例
這篇文章主要介紹了Android編程使用android-support-design實(shí)現(xiàn)MD風(fēng)格對(duì)話框功能,涉及Android對(duì)話框、視圖、布局相關(guān)操作技巧,需要的朋友可以參考下2017-01-01