如何自定义一个View,并动态设置style?

2 篇文章 0 订阅
1 篇文章 0 订阅

定义一个TextView的style,常用的方法是在xml文件中实现,但有时候我们需要动态的在代码中自定义个style的View,进行动态的添加或删除等控制,这时候需要用到inflater方法。

TextView的xml,R.layout.empty_text_view:

<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/empty_text_view"
        android:text="@string/tips_no_relative_order_list"
        style="@style/emptyView"
        android:visibility="visible"/>

stytles.xml文件中的style定义:

  <style name="emptyView">
        <item name="android:textSize">@dimen/default_text_size_large</item>
        <item name="android:background">@drawable/tips_for_empty_content_bg</item>
        <item name="android:visibility">gone</item>
        <item name="android:paddingTop">20dp</item>
        <item name="android:paddingBottom">20dp</item>
        <item name="android:paddingLeft">50dp</item>
        <item name="android:paddingRight">50dp</item>
        <item name="android:layout_centerInParent">true</item>
        <item name="android:layout_gravity">center</item>
        <item name="android:layout_width">wrap_content</item>
        <item name="android:layout_height">wrap_content</item>
    </style>

代码中动态定义TextView:

 ***TextView emptyTextView = (TextView) inflater.inflate(R.layout.empty_text_view, null);***

需要注意的是它与fragment中使用的区别,如自定义一个fragment时,需要实现onCreateView方法,以定义fragment对应的布局xml:

public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        View rootView = ***inflater.inflate(R.layout.fragment_trade_record, container, false);***
        }

而它与listView的adapter的getView方法中定义xml文件的方法相同:


    @Override
    public View getView(int i, View view, ViewGroup viewgroup) {
        titleView = null;
        iconView=null;
        if(view == null){
            view = ***LayoutInflater.from(context).inflate(R.layout.trade_list_item_info, null);***
        }

        titleView=(TextView)view.findViewById(R.id.TradeItemTitle);
       titleView.setText(tradeTitleAndIconList.get(i).titleName);
        iconView=(TextView)view.findViewById(R.id.TradeItemIcon);

        if (tradeTitleAndIconList.get(i).selected)
        {
            titleView.setTextColor(Color.RED);
            iconView.setBackgroundResource(tradeTitleAndIconList.get(i).titleIconRed);
        }

        else
        {
            titleView.setTextColor(Color.WHITE);
            iconView.setBackgroundResource(tradeTitleAndIconList.get(i).titleIcon);

        }

        return view;
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
自定义一个水波进度 View,你需要完成以下几个步骤: 1. 创建一个自定义 View 类,并在构造函数中初始化一些必要的属性,如颜色、线宽等。 2. 重写 onSizeChanged() 方法,在该方法中获取 View 的宽度和高度,并计算出进度条的半径、圆心等相关参数。 3. 重写 onDraw() 方法,在该方法中绘制水波纹效果。 4. 在自定义 View 中添加一个 setProgress() 方法,用于设置进度条的进度。 5. 在布局文件中引入自定义 View设置 layout_width 和 layout_height 属性,并在代码中调用 setProgress() 方法设置进度条的进度。 下面是一个简单的自定义水波进度 View 的代码示例: ```java public class WaterWaveProgressView extends View { private Paint mPaint; private int mWidth, mHeight; private float mRadius; private float mProgress; public WaterWaveProgressView(Context context) { super(context); init(); } public WaterWaveProgressView(Context context, AttributeSet attrs) { super(context, attrs); init(); } public WaterWaveProgressView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); init(); } private void init() { mPaint = new Paint(Paint.ANTI_ALIAS_FLAG); mPaint.setColor(Color.BLUE); mPaint.setStrokeWidth(5); mPaint.setStyle(Paint.Style.STROKE); } @Override protected void onSizeChanged(int w, int h, int oldw, int oldh) { super.onSizeChanged(w, h, oldw, oldh); mWidth = w; mHeight = h; mRadius = Math.min(mWidth, mHeight) / 2 * 0.8f; } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); canvas.drawCircle(mWidth / 2, mHeight / 2, mRadius, mPaint); float angle = mProgress / 100 * 360; canvas.drawArc(mWidth / 2 - mRadius, mHeight / 2 - mRadius, mWidth / 2 + mRadius, mHeight / 2 + mRadius, -90, angle, false, mPaint); } public void setProgress(float progress) { mProgress = progress; invalidate(); } } ``` 通过调用 setProgress() 方法来更新进度条的进度,如下所示: ```java WaterWaveProgressView progressView = findViewById(R.id.progress_view); progressView.setProgress(50); // 设置进度为 50% ``` 在布局文件中引入自定义 View: ```xml <com.example.waterwaveprogressview.WaterWaveProgressView android:id="@+id/progress_view" android:layout_width="150dp" android:layout_height="150dp" /> ``` 这样就能够实现一个简单的水波进度 View 了。如果需要更加复杂的效果,可以在 onDraw() 方法中绘制多个水波纹,或者使用 Path 绘制波形等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值