项目中很多地方需要用到的一个标题,自己第一次封装一个控件
attr.xml:定义控件属性
topview.xml:
引用控件:
activity_main.xml:
记录一下。
代码中关于字体大小适配的方法不是很好,希望大神看到可以告知好的方法
public class TopView extends LinearLayout implements OnClickListener { private TextView mTvTitle, mTvRight; private ImageView mImgRight, mImgLeft; private int mTvColor; private float mTvSize, mRightSize; private String mTvText, mRightText; private Drawable mImgLeftSrc, mImgRightSrc; private TopViewListener mTopViewLeftListener = null, mTopViewRightListener = null; private boolean isRightShow, isLeftShow; public TopView(Context context, AttributeSet attrs) { super(context, attrs); TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.topView); mTvColor = typedArray.getColor(R.styleable.topView_TopViewColor, context.getResources().getColor(R.color.white)); mTvSize = typedArray.getDimensionPixelSize( R.styleable.topView_TopViewSize, 20); mRightSize = typedArray.getDimensionPixelSize( R.styleable.topView_RightSize, 0); mTvText = typedArray.getString(R.styleable.topView_TopViewText); mRightText = typedArray.getString(R.styleable.topView_RightText); mImgLeftSrc = typedArray.getDrawable(R.styleable.topView_LeftSrc); mImgRightSrc = typedArray.getDrawable(R.styleable.topView_RightSrc); isRightShow = typedArray.getBoolean(R.styleable.topView_isRightShow, true); isLeftShow = typedArray .getBoolean(R.styleable.topView_isLeftShow, true); DisplayMetrics dm = getScreenParams(context); int densityDPI = dm.densityDpi; computeTextSize(densityDPI); LayoutInflater.from(context).inflate(R.layout.topview, this); mTvTitle = (TextView) this.findViewById(R.id.tv_title); mImgLeft = (ImageView) this.findViewById(R.id.img_left); mImgRight = (ImageView) this.findViewById(R.id.img_right); mTvRight = (TextView) this.findViewById(R.id.tv_right); LinearLayout layout = (LinearLayout) this.findViewById(R.id.layout); mTvTitle.setTextColor(mTvColor); mTvTitle.setTextSize(mTvSize); mTvTitle.setText(mTvText); mTvRight.setTextSize(mRightSize); mTvRight.setText(mRightText); mImgLeft.setImageDrawable(mImgLeftSrc); if (isLeftShow) { mImgLeft.setVisibility(View.VISIBLE); } else { mImgLeft.setVisibility(View.GONE); } mImgLeft.setOnClickListener(this); mImgRight.setImageDrawable(mImgRightSrc); layout.setOnClickListener(this); if (isRightShow) { layout.setVisibility(View.VISIBLE); } else { layout.setVisibility(View.GONE); } typedArray.recycle(); } /** * 根据不同屏幕密度计算字体大小 * * Because... NORMAL is NOT hdpi... Normal is mdpi (160dpi) = 1.0x. hdpi * (240dpi) is 1.5x. xhdpi (320dpi) is 2.0x. xxdpi (480dpi) is 3.0x. xxxhdpi * (640dpi) is 4.0x. And (last, but not least) ldpi (120dpi) is 0.75x. */ private void computeTextSize(int dpi) { switch (dpi) { case 120: mTvSize = (float) (mTvSize / 0.75); mRightSize = (float) (mRightSize / 0.75); break; case 240: mTvSize = (float) (mTvSize / 1.5); mRightSize = (float) (mRightSize / 1.5); break; case 320: mTvSize = mTvSize / 2; mRightSize = mRightSize / 2; break; case 480: mTvSize = mTvSize / 3; mRightSize = mRightSize / 3; break; case 640: mTvSize = mTvSize / 4; mRightSize = mRightSize / 4; break; default: break; } } /** * 获取屏幕参数:宽,高 * * @param context */ private DisplayMetrics getScreenParams(Context context) { DisplayMetrics dm = context.getResources().getDisplayMetrics(); return dm; } @Override public void onClick(View v) { switch (v.getId()) { case R.id.img_left://左边按钮 if (mTopViewLeftListener != null) { mTopViewLeftListener.onTopViewClick(v); } break; case R.id.layout://右边按钮 if (mTopViewRightListener != null) { mTopViewRightListener.onTopViewClick(v); } break; } } /** * 定义一个接口 */ public interface TopViewListener { void onTopViewClick(View v); } /** * 自定义控件的点击事件 */ public void setonLeftClick(TopViewListener topViewListener) { mTopViewLeftListener = topViewListener; } public void setonRightClick(TopViewListener topViewListener) { mTopViewRightListener = topViewListener; } }
attr.xml:定义控件属性
<?xml version="1.0" encoding="utf-8"?> <resources> <declare-styleable name="topView"> <attr name="TopViewColor" format="color" /> <attr name="TopViewSize" format="dimension" /> <attr name="TopViewText" format="string" /> <attr name="RightSize" format="dimension" /> <attr name="RightText" format="string" /> <attr name="LeftSrc" format="reference" /> <attr name="RightSrc" format="reference" /> <attr name="isRightShow" format="boolean" /> <attr name="isLeftShow" format="boolean" /> </declare-styleable> </resources>
topview.xml:
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="@color/bg_color" > <ImageView android:id="@+id/img_left" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerVertical="true" android:layout_marginLeft="15dp" android:src="@drawable/daidide_fanhui" /> <TextView android:id="@+id/tv_title" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerInParent="true" android:text="title" android:textColor="@color/white" android:textSize="20sp" /> <LinearLayout android:id="@+id/layout" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentRight="true" android:layout_centerVertical="true" android:layout_marginRight="15dp" android:gravity="center" android:orientation="vertical" > <ImageView android:id="@+id/img_right" android:layout_width="30dp" android:layout_height="30dp" android:background="@drawable/daidideerj" /> <TextView android:id="@+id/tv_right" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="1111" android:textColor="#ffffff" android:textSize="12sp" /> </LinearLayout> </RelativeLayout>
引用控件:
activity_main.xml:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:top="http://schemas.android.com/apk/res/com.example.topview" android:layout_width="match_parent" android:layout_height="match_parent" > <com.example.topview.TopView android:id="@+id/topview" android:layout_width="match_parent" android:layout_height="wrap_content" top:LeftSrc="@drawable/daidide_fanhui" top:RightSize="12sp" top:RightSrc="@drawable/daidideerj" top:RightText="联系客服" top:TopViewColor="#ffffff" top:TopViewSize="20sp" top:isRightShow="false" top:TopViewText="标题" /> </LinearLayout>
public class MainActivity extends Activity { private TopView mTopView; private Activity mActivity = MainActivity.this; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mTopView = (TopView) findViewById(R.id.topview); mTopView.setonLeftClick(new TopViewListener() { @Override public void onTopViewClick(View v) { Toast.makeText(mActivity, "left", Toast.LENGTH_SHORT).show(); } }); mTopView.setonRightClick(new TopViewListener() { @Override public void onTopViewClick(View v) { Toast.makeText(mActivity, "right", Toast.LENGTH_SHORT).show(); } }); } }
记录一下。
代码中关于字体大小适配的方法不是很好,希望大神看到可以告知好的方法
相关文章推荐
- android自定义控件的创建和使用
- Android 实现自定义控件效果1
- Android中自定义控件
- android中使用自定义控件是报android.view.InflateException: Binary XML 异常
- Android应用之个人应用软件开发(4)【深度UI设计自定义控件】
- Android 自定义控件 eBook 翻书效果
- Android 自定义控件-SnakeLayout (仿gallery)
- android EditText里面嵌入两个按钮,通过按钮可以加减EditText里的数字,组合自定义控件。
- Android declare-styleable:自定义控件的属性(attr.xml,TypedArray)的使用
- Android 实现自定义控件效果2
- Android 自定义控件 eBook 翻书效果
- Android 自定义控件 eBook 翻书效果
- Android 自定义控件的 拖拽、移动 实现 方法
- Android 自定义控件 仿乐Phone UI
- 【转】Android自定义控件中自定义属性的处理方式
- android 自定义控件属性
- Android 自定义控件-SnakeLayout (仿gallery)
- android自定义控件的创建和使用
- [转]Android.自定义控件的实现
- Android自定义控件(2)