修改supportV4中的PagerTitleStrip的文字显示效果
来源:互联网 发布:js 鼠标滚轮事件 编辑:程序博客网 时间:2024/05/16 07:16
在使用中,发现PagerTitleStrip显示的标题问题无法设置文字颜色和大小,经过查找代码,明显这个问题在4.0以后的新版本中已经被解决,那么现在如何解决这个问题呢?
其实很简单,用反射
mPagerTitleStrip = (PagerTitleStrip) findViewById(R.id.pagertitle);try {Field field=mPagerTitleStrip.getClass().getDeclaredField("mCurrText");field.setAccessible(true);TextView view=(TextView) field.get(mPagerTitleStrip);view.setTextColor(Color.BLACK);} catch (IllegalArgumentException e) {e.printStackTrace();} catch (IllegalAccessException e) {e.printStackTrace();} catch (SecurityException e) {e.printStackTrace();} catch (NoSuchFieldException e) {e.printStackTrace();}
PagerTitleStrip控件中显示文字的三个TextView,用反射获得这3个TextView,对其进行设置即可。
附带:PagerTitleStrip源码
/* * Copyright (C) 2011 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */package android.support.v4.view;import android.content.Context;import android.content.res.TypedArray;import android.database.DataSetObserver;import android.graphics.drawable.Drawable;import android.text.TextUtils.TruncateAt;import android.util.AttributeSet;import android.util.TypedValue;import android.view.ViewGroup;import android.view.ViewParent;import android.widget.TextView;/** * PagerTitleStrip is a non-interactive indicator of the current, next, * and previous pages of a {@link ViewPager}. It is intended to be used as a * child view of a ViewPager widget in your XML layout. * Add it as a child of a ViewPager in your layout file and set its * android:layout_gravity to TOP or BOTTOM to pin it to the top or bottom * of the ViewPager. The title from each page is supplied by the method * {@link PagerAdapter#getPageTitle(int)} in the adapter supplied to * the ViewPager. */public class PagerTitleStrip extends ViewGroup implements ViewPager.Decor { private static final String TAG = "PagerTitleStrip"; ViewPager mPager; private TextView mPrevText; private TextView mCurrText; private TextView mNextText; private int mLastKnownCurrentPage = -1; private float mLastKnownPositionOffset = -1; private int mScaledTextSpacing; private boolean mUpdatingText; private boolean mUpdatingPositions; private final PageListener mPageListener = new PageListener(); private static final int[] ATTRS = new int[] { android.R.attr.textAppearance, android.R.attr.textColor, android.R.attr.textSize }; private int mNonPrimaryAlpha; int mTextColor; private static final int SIDE_ALPHA = 0x99; // single-byte alpha, 0 = invisible, FF = opaque private static final int TEXT_SPACING = 16; // dip public PagerTitleStrip(Context context) { this(context, null); } public PagerTitleStrip(Context context, AttributeSet attrs) { super(context, attrs); addView(mPrevText = new TextView(context)); addView(mCurrText = new TextView(context)); addView(mNextText = new TextView(context)); final TypedArray a = context.obtainStyledAttributes(attrs, ATTRS); final int textAppearance = a.getResourceId(0, 0); if (textAppearance != 0) { mPrevText.setTextAppearance(context, textAppearance); mCurrText.setTextAppearance(context, textAppearance); mNextText.setTextAppearance(context, textAppearance); } if (a.hasValue(1)) { final int textColor = a.getColor(1, 0); mPrevText.setTextColor(textColor); mCurrText.setTextColor(textColor); mNextText.setTextColor(textColor); } final int textSize = a.getDimensionPixelSize(2, 0); if (textSize != 0) { mPrevText.setTextSize(TypedValue.COMPLEX_UNIT_PX, textSize); mCurrText.setTextSize(TypedValue.COMPLEX_UNIT_PX, textSize); mNextText.setTextSize(TypedValue.COMPLEX_UNIT_PX, textSize); } a.recycle(); mTextColor = mCurrText.getTextColors().getDefaultColor(); setNonPrimaryAlpha(SIDE_ALPHA); mPrevText.setEllipsize(TruncateAt.END); mCurrText.setEllipsize(TruncateAt.END); mNextText.setEllipsize(TruncateAt.END); mPrevText.setSingleLine(); mCurrText.setSingleLine(); mNextText.setSingleLine(); final float density = context.getResources().getDisplayMetrics().density; mScaledTextSpacing = (int) (TEXT_SPACING * density); } @Override protected void onAttachedToWindow() { super.onAttachedToWindow(); final ViewParent parent = getParent(); if (!(parent instanceof ViewPager)) { throw new IllegalStateException( "PagerTitleStrip must be a direct child of a ViewPager."); } final ViewPager pager = (ViewPager) parent; final PagerAdapter adapter = pager.getAdapter(); pager.setInternalPageChangeListener(mPageListener); pager.setOnAdapterChangeListener(mPageListener); mPager = pager; updateAdapter(null, adapter); } @Override protected void onDetachedFromWindow() { updateAdapter(mPager.getAdapter(), null); mPager.setInternalPageChangeListener(null); mPager.setOnAdapterChangeListener(null); mPager = null; } /** * Set the alpha value used for non-primary page titles. * * @param alpha Opacity value in the range 0-1f */ public void setNonPrimaryAlpha(float alpha) { mNonPrimaryAlpha = (int) (alpha * 255) & 0xFF; final int transparentColor = (mNonPrimaryAlpha << 24) | (mTextColor & 0xFFFFFF); mPrevText.setTextColor(transparentColor); mNextText.setTextColor(transparentColor); } /** * Set the color value used as the base color for all displayed page titles. * Alpha will be ignored for non-primary page titles. See {@link #setNonPrimaryAlpha(float)}. * * @param color Color hex code in 0xAARRGGBB format */ public void setTextColor(int color) { mTextColor = color; mCurrText.setTextColor(color); final int transparentColor = (mNonPrimaryAlpha << 24) | (mTextColor & 0xFFFFFF); mPrevText.setTextColor(transparentColor); mNextText.setTextColor(transparentColor); } void updateText(int currentItem, PagerAdapter adapter) { final int itemCount = adapter != null ? adapter.getCount() : 0; mUpdatingText = true; CharSequence text = null; if (currentItem >= 1 && adapter != null) { text = adapter.getPageTitle(currentItem - 1); } mPrevText.setText(text); mCurrText.setText(adapter != null ? adapter.getPageTitle(currentItem) : null); text = null; if (currentItem + 1 < itemCount && adapter != null) { text = adapter.getPageTitle(currentItem + 1); } mNextText.setText(text); // Measure everything final int width = getWidth() - getPaddingLeft() - getPaddingRight(); final int childHeight = getHeight() - getPaddingTop() - getPaddingBottom(); final int childWidthSpec = MeasureSpec.makeMeasureSpec((int) (width * 0.8f), MeasureSpec.AT_MOST); final int childHeightSpec = MeasureSpec.makeMeasureSpec(childHeight, MeasureSpec.EXACTLY); mPrevText.measure(childWidthSpec, childHeightSpec); mCurrText.measure(childWidthSpec, childHeightSpec); mNextText.measure(childWidthSpec, childHeightSpec); mLastKnownCurrentPage = currentItem; if (!mUpdatingPositions) { updateTextPositions(currentItem, mLastKnownPositionOffset); } mUpdatingText = false; } @Override public void requestLayout() { if (!mUpdatingText) { super.requestLayout(); } } void updateAdapter(PagerAdapter oldAdapter, PagerAdapter newAdapter) { if (oldAdapter != null) { oldAdapter.unregisterDataSetObserver(mPageListener); } if (newAdapter != null) { newAdapter.registerDataSetObserver(mPageListener); } if (mPager != null) { mLastKnownCurrentPage = -1; mLastKnownPositionOffset = -1; updateText(mPager.getCurrentItem(), newAdapter); requestLayout(); } } void updateTextPositions(int position, float positionOffset) { if (position != mLastKnownCurrentPage) { updateText(position, mPager.getAdapter()); } else if (positionOffset == mLastKnownPositionOffset) { return; } mUpdatingPositions = true; final int prevWidth = mPrevText.getMeasuredWidth(); final int currWidth = mCurrText.getMeasuredWidth(); final int nextWidth = mNextText.getMeasuredWidth(); final int halfCurrWidth = currWidth / 2; final int stripWidth = getWidth(); final int paddingLeft = getPaddingLeft(); final int paddingRight = getPaddingRight(); final int paddingTop = getPaddingTop(); final int textPaddedLeft = paddingLeft + halfCurrWidth; final int textPaddedRight = paddingRight + halfCurrWidth; final int contentWidth = stripWidth - textPaddedLeft - textPaddedRight; float currOffset = positionOffset + 0.5f; if (currOffset > 1.f) { currOffset -= 1.f; } final int currCenter = stripWidth - textPaddedRight - (int) (contentWidth * currOffset); final int currLeft = currCenter - currWidth / 2; final int currRight = currLeft + currWidth; mCurrText.layout(currLeft, paddingTop, currRight, paddingTop + mCurrText.getMeasuredHeight()); final int prevLeft = Math.min(paddingLeft, currLeft - mScaledTextSpacing - prevWidth); mPrevText.layout(prevLeft, paddingTop, prevLeft + prevWidth, paddingTop + mPrevText.getMeasuredHeight()); final int nextLeft = Math.max(stripWidth - paddingRight - nextWidth, currRight + mScaledTextSpacing); mNextText.layout(nextLeft, paddingTop, nextLeft + nextWidth, paddingTop + mNextText.getMeasuredHeight()); mLastKnownPositionOffset = positionOffset; mUpdatingPositions = false; } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { final int widthMode = MeasureSpec.getMode(widthMeasureSpec); final int heightMode = MeasureSpec.getMode(heightMeasureSpec); final int widthSize = MeasureSpec.getSize(widthMeasureSpec); final int heightSize = MeasureSpec.getSize(heightMeasureSpec); if (widthMode != MeasureSpec.EXACTLY) { throw new IllegalStateException("Must measure with an exact width"); } int childHeight = heightSize; int minHeight = 0; int padding = 0; final Drawable bg = getBackground(); if (bg != null) { minHeight = bg.getIntrinsicHeight(); } padding = getPaddingTop() + getPaddingBottom(); childHeight -= padding; final int childWidthSpec = MeasureSpec.makeMeasureSpec((int) (widthSize * 0.8f), MeasureSpec.AT_MOST); final int childHeightSpec = MeasureSpec.makeMeasureSpec(childHeight, heightMode); mPrevText.measure(childWidthSpec, childHeightSpec); mCurrText.measure(childWidthSpec, childHeightSpec); mNextText.measure(childWidthSpec, childHeightSpec); if (heightMode == MeasureSpec.EXACTLY) { setMeasuredDimension(widthSize, heightSize); } else { int textHeight = mCurrText.getMeasuredHeight(); setMeasuredDimension(widthSize, Math.max(minHeight, textHeight + padding)); } } @Override protected void onLayout(boolean changed, int l, int t, int r, int b) { if (mPager != null) { updateTextPositions(mPager.getCurrentItem(), 0.f); } } private class PageListener extends DataSetObserver implements ViewPager.OnPageChangeListener, ViewPager.OnAdapterChangeListener { private int mScrollState; @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { if (positionOffset > 0.5f) { // Consider ourselves to be on the next page when we're 50% of the way there. position++; } updateTextPositions(position, positionOffset); } @Override public void onPageSelected(int position) { if (mScrollState == ViewPager.SCROLL_STATE_IDLE) { // Only update the text here if we're not dragging or settling. updateText(mPager.getCurrentItem(), mPager.getAdapter()); } } @Override public void onPageScrollStateChanged(int state) { mScrollState = state; } @Override public void onAdapterChanged(PagerAdapter oldAdapter, PagerAdapter newAdapter) { updateAdapter(oldAdapter, newAdapter); } @Override public void onChanged() { updateText(mPager.getCurrentItem(), mPager.getAdapter()); } }}
- 修改supportV4中的PagerTitleStrip的文字显示效果
- 能否修改android supportv4包的源码?
- 修改安装过程中的文字显示
- android显示TextView文字的倒影效果
- android显示TextView文字的倒影效果
- Android显示TextView文字的倒影效果
- 关于ViewPager PagerTitleStrip mPrevText 和 mNextText 显示的问题
- 文字同步显示效果
- 文字渐渐显示效果
- 文字滚动显示效果
- 修改MFC中菜单显示的文字
- 修改MFC中菜单显示的文字
- 如何关联supportv4的源代码
- view.PagerTitleStrip的使用
- 修改Cocos2dx中的CCMessageBox的按钮文字
- 修改Cocos2dx中的CCMessageBox的按钮文字
- Android的TextView中的文字居中显示
- Viewpager中的pageTabStrip和PagerTitleStrip
- js表单操作,常用
- osg for android 学习之十:注意事项
- monkeyrunner自动化测试
- datepicker应用大全
- 数理逻辑:谓词演算(11)对偶规则
- 修改supportV4中的PagerTitleStrip的文字显示效果
- 应聘时最漂亮的回答! 留着 早晚用的上 2012
- 时尚达人第一季:全新iPad轻松玩(全彩)
- #ifdef 与#define 意义与 作用
- linux下的grep使用
- sql中怎样把同一张表中相同字段的内容合并为一条记录(合并的记录的后面不加逗号)?
- android学习之-ListView实现特殊效果
- GCC 预编译
- java入门1