滑动式界面和消息数视图

来源:互联网 发布:88端口怎么起 编辑:程序博客网 时间:2024/05/17 19:58

top1.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="fill_parent"    android:layout_height="wrap_content"    android:background="@drawable/top1_bg" >    <LinearLayout        android:layout_width="wrap_content"        android:layout_height="50dip"        android:gravity="center_vertical"        android:orientation="horizontal" >        <ImageView            android:layout_width="32dip"            android:layout_height="32dip"            android:layout_marginLeft="10dip"            android:src="@drawable/actionbar_icon" />        <TextView            android:layout_width="wrap_content"            android:layout_height="wrap_content"            android:layout_marginLeft="10dip"            android:text="微信"            android:textColor="#d3d3d3"            android:textSize="15sp" />    </LinearLayout>    <LinearLayout        android:layout_width="wrap_content"        android:layout_height="50dip"        android:layout_alignParentRight="true"        android:gravity="center_vertical"        android:orientation="horizontal" >        <ImageView            android:layout_width="32dip"            android:layout_height="32dip"            android:layout_marginLeft="10dip"            android:src="@drawable/actionbar_search_icon" />        <ImageView            android:layout_width="32dip"            android:layout_height="32dip"            android:layout_marginLeft="10dip"            android:src="@drawable/actionbar_add_icon" />        <ImageView            android:layout_width="32dip"            android:layout_height="32dip"            android:layout_marginLeft="10dip"            android:src="@drawable/actionbar_more_icon" />    </LinearLayout></RelativeLayout>

Top2.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="fill_parent"    android:layout_height="wrap_content"    android:orientation="vertical" >    <LinearLayout        android:layout_width="match_parent"        android:layout_height="48dip"        android:background="#eee"        android:orientation="horizontal" >        <LinearLayout            android:layout_width="0dip"            android:layout_height="match_parent"            android:layout_weight="1"            android:gravity="center"            android:orientation="horizontal" >            <TextView                android:id="@+id/id_tv_chat"                android:layout_width="wrap_content"                android:layout_height="wrap_content"                android:text="聊天"                android:textColor="#009000"                android:textSize="16dip"               />        </LinearLayout>        <LinearLayout            android:id="@+id/id_ll_find"            android:layout_width="0dip"            android:layout_height="match_parent"            android:layout_weight="1"            android:gravity="center"            android:orientation="horizontal" >            <TextView                android:id="@+id/id_tv_find"                android:layout_width="wrap_content"                android:layout_height="wrap_content"                android:text="发现"                android:textColor="@android:color/black"                android:textSize="16dip"                />        </LinearLayout>        <LinearLayout            android:layout_width="0dip"            android:layout_height="match_parent"            android:layout_weight="1"            android:gravity="center"            android:orientation="horizontal" >            <TextView                android:id="@+id/id_tv_contact"                android:layout_width="wrap_content"                android:layout_height="wrap_content"                android:text="通讯录"                android:textColor="@android:color/black"                android:textSize="16dip"                />        </LinearLayout>    </LinearLayout>    <ImageView        android:id="@+id/id_iv_tabline"        android:layout_width="100dip"        android:layout_height="2dip"        android:background="@drawable/tabline" /></LinearLayout>


Tab01-03.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="fill_parent"    android:layout_height="fill_parent"    android:gravity="center"    android:orientation="vertical" >        <TextView         android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:text="This is first Tab"        android:textSize="20sp"        android:textColor="@android:color/black"        /></LinearLayout>

MainActivity.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="fill_parent"    android:layout_height="fill_parent"    android:orientation="vertical" >    <include layout="@layout/top1" />    <include layout="@layout/top2" />    <android.support.v4.view.ViewPager        android:id="@+id/id_viewPager"        android:layout_width="match_parent"        android:layout_height="match_parent" /></LinearLayout>

MainActivity.java

package com.weixin_ui;import java.util.ArrayList;import com.jauker.widget.BadgeView;import android.graphics.Color;import android.os.Bundle;import android.support.v4.app.Fragment;import android.support.v4.app.FragmentActivity;import android.support.v4.app.FragmentPagerAdapter;import android.support.v4.view.ViewPager;import android.support.v4.view.ViewPager.OnPageChangeListener;import android.util.DisplayMetrics;import android.view.Display;import android.view.ViewGroup.LayoutParams;import android.view.Window;import android.widget.ImageView;import android.widget.LinearLayout;import android.widget.TextView;public class MainActivity extends FragmentActivity {private ViewPager mViewPager;private ArrayList<Fragment> mDatas;private FragmentPagerAdapter mAdapter;private TextView mChatTextView;private TextView mFindTextView;private TextView mContactTextView;private ImageView mTabline;private int mScreen1_3;private int mCurrentPageIndex;private LinearLayout mllFind;private BadgeView mBadgeView;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);requestWindowFeature(Window.FEATURE_NO_TITLE);setContentView(R.layout.activity_main);initView();}private void initView() {initTabline();mViewPager = (ViewPager) findViewById(R.id.id_viewPager);mDatas = new ArrayList<Fragment>();ChatTabFragment tab01 = new ChatTabFragment();FindTabFragment tab02 = new FindTabFragment();ContactTabFragment tab03 = new ContactTabFragment();mDatas.add(tab01);mDatas.add(tab02);mDatas.add(tab03);mChatTextView = (TextView) findViewById(R.id.id_tv_chat);mFindTextView = (TextView) findViewById(R.id.id_tv_find);mContactTextView = (TextView) findViewById(R.id.id_tv_contact);mllFind = (LinearLayout) findViewById(R.id.id_ll_find);mAdapter = new FragmentPagerAdapter(getSupportFragmentManager()) {@Overridepublic int getCount() {return mDatas.size();}@Overridepublic Fragment getItem(int position) {return mDatas.get(position);}};mViewPager.setAdapter(mAdapter);mViewPager.setOnPageChangeListener(new OnPageChangeListener() {@Overridepublic void onPageSelected(int position) {resetColor();switch (position) {case 0:mChatTextView.setTextColor(Color.parseColor("#009000"));break;case 1:if (mBadgeView != null) {mllFind.removeView(mBadgeView);}mBadgeView = new BadgeView(MainActivity.this);mBadgeView.setBadgeCount(16);mllFind.addView(mBadgeView);mFindTextView.setTextColor(Color.parseColor("#009000"));break;case 2:mContactTextView.setTextColor(Color.parseColor("#009000"));break;}mCurrentPageIndex = position;}private void resetColor() {mChatTextView.setTextColor(Color.BLACK);mFindTextView.setTextColor(Color.BLACK);mContactTextView.setTextColor(Color.BLACK);}@Overridepublic void onPageScrolled(int position, float positionOffset,int positionOffsetPx) {LinearLayout.LayoutParams lp = (android.widget.LinearLayout.LayoutParams) mTabline.getLayoutParams();if (mCurrentPageIndex == 0 && position == 0) {// 0-1lp.leftMargin = (int) (mCurrentPageIndex * mScreen1_3 + positionOffset* mScreen1_3);} else if (mCurrentPageIndex == 1 && position == 0) {// 1-0lp.leftMargin = (int) (mCurrentPageIndex * mScreen1_3 + (positionOffset - 1)* mScreen1_3);} else if (mCurrentPageIndex == 1 && position == 1) {// 1-2lp.leftMargin = (int) (mCurrentPageIndex * mScreen1_3 + positionOffset* mScreen1_3);} else if (mCurrentPageIndex == 2 && position == 1) {// 2-1lp.leftMargin = (int) (mCurrentPageIndex * mScreen1_3 + (positionOffset - 1)* mScreen1_3);}mTabline.setLayoutParams(lp);}@Overridepublic void onPageScrollStateChanged(int arg0) {}});}private void initTabline() {mTabline = (ImageView) findViewById(R.id.id_iv_tabline);Display display = getWindowManager().getDefaultDisplay();DisplayMetrics outMetrics = new DisplayMetrics();display.getMetrics(outMetrics);mScreen1_3 = outMetrics.widthPixels / 3;LayoutParams lp = mTabline.getLayoutParams();lp.width = mScreen1_3;mTabline.setLayoutParams(lp);}}

ChatTabFragment...

package com.weixin_ui;import android.os.Bundle;import android.support.annotation.Nullable;import android.support.v4.app.Fragment;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;public class ChatTabFragment extends Fragment {@Overridepublic View onCreateView(LayoutInflater inflater,@Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {View view =inflater.inflate(R.layout.tab01, container, false);return view;}}
------------------------------------------------------------------------------------------------------------
BadgeView

/* * BadgeView.java * BadgeView *  * Copyright (c) 2012 Stefan Jauker. * https://github.com/kodex83/BadgeView *  * 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 com.jauker.widget;import android.content.Context;import android.graphics.Color;import android.graphics.Typeface;import android.graphics.drawable.ShapeDrawable;import android.graphics.drawable.shapes.RoundRectShape;import android.util.AttributeSet;import android.util.Log;import android.util.TypedValue;import android.view.Gravity;import android.view.View;import android.view.ViewGroup;import android.widget.FrameLayout;import android.widget.FrameLayout.LayoutParams;import android.widget.TabWidget;import android.widget.TextView;public class BadgeView extends TextView {    private boolean mHideOnNull = true;    public BadgeView(Context context) {        this(context, null);    }    public BadgeView(Context context, AttributeSet attrs) {        this(context, attrs, android.R.attr.textViewStyle);    }    public BadgeView(Context context, AttributeSet attrs, int defStyle) {        super(context, attrs, defStyle);        init();    }    private void init() {        if (!(getLayoutParams() instanceof LayoutParams)) {            LayoutParams layoutParams =                    new LayoutParams(                            android.view.ViewGroup.LayoutParams.WRAP_CONTENT,                            android.view.ViewGroup.LayoutParams.WRAP_CONTENT,                            Gravity.RIGHT | Gravity.TOP);            setLayoutParams(layoutParams);        }        // set default font        setTextColor(Color.WHITE);        setTypeface(Typeface.DEFAULT_BOLD);        setTextSize(TypedValue.COMPLEX_UNIT_SP, 11);        setPadding(dip2Px(5), dip2Px(1), dip2Px(5), dip2Px(1));        // set default background        setBackground(9, Color.parseColor("#d3321b"));        setGravity(Gravity.CENTER);        // default values        setHideOnNull(true);        setBadgeCount(0);    }    @SuppressWarnings("deprecation")    public void setBackground(int dipRadius, int badgeColor) {        int radius = dip2Px(dipRadius);        float[] radiusArray = new float[] { radius, radius, radius, radius, radius, radius, radius, radius };        RoundRectShape roundRect = new RoundRectShape(radiusArray, null, null);        ShapeDrawable bgDrawable = new ShapeDrawable(roundRect);        bgDrawable.getPaint().setColor(badgeColor);        setBackgroundDrawable(bgDrawable);    }    /**     * @return Returns true if view is hidden on badge value 0 or null;     */    public boolean isHideOnNull() {        return mHideOnNull;    }    /**     * @param hideOnNull the hideOnNull to set     */    public void setHideOnNull(boolean hideOnNull) {        mHideOnNull = hideOnNull;        setText(getText());    }    /*     * (non-Javadoc)     *      * @see android.widget.TextView#setText(java.lang.CharSequence, android.widget.TextView.BufferType)     */    @Override    public void setText(CharSequence text, BufferType type) {        if (isHideOnNull() && (text == null || text.toString().equalsIgnoreCase("0"))) {            setVisibility(View.GONE);        } else {            setVisibility(View.VISIBLE);        }        super.setText(text, type);    }    public void setBadgeCount(int count) {        setText(String.valueOf(count));    }    public Integer getBadgeCount() {        if (getText() == null) {            return null;        }        String text = getText().toString();        try {            return Integer.parseInt(text);        } catch (NumberFormatException e) {            return null;        }    }    public void setBadgeGravity(int gravity) {        FrameLayout.LayoutParams params = (LayoutParams) getLayoutParams();        params.gravity = gravity;        setLayoutParams(params);    }    public int getBadgeGravity() {        FrameLayout.LayoutParams params = (LayoutParams) getLayoutParams();        return params.gravity;    }    public void setBadgeMargin(int dipMargin) {        setBadgeMargin(dipMargin, dipMargin, dipMargin, dipMargin);    }    public void setBadgeMargin(int leftDipMargin, int topDipMargin, int rightDipMargin, int bottomDipMargin) {        FrameLayout.LayoutParams params = (LayoutParams) getLayoutParams();        params.leftMargin = dip2Px(leftDipMargin);        params.topMargin = dip2Px(topDipMargin);        params.rightMargin = dip2Px(rightDipMargin);        params.bottomMargin = dip2Px(bottomDipMargin);        setLayoutParams(params);    }    public int[] getBadgeMargin() {        FrameLayout.LayoutParams params = (LayoutParams) getLayoutParams();        return new int[] { params.leftMargin, params.topMargin, params.rightMargin, params.bottomMargin };    }    public void incrementBadgeCount(int increment) {        Integer count = getBadgeCount();        if (count == null) {            setBadgeCount(increment);        } else {            setBadgeCount(increment + count);        }    }    public void decrementBadgeCount(int decrement) {        incrementBadgeCount(-decrement);    }    /*     * Attach the BadgeView to the TabWidget     *      * @param target the TabWidget to attach the BadgeView     *      * @param tabIndex index of the tab     */    public void setTargetView(TabWidget target, int tabIndex) {        View tabView = target.getChildTabViewAt(tabIndex);        setTargetView(tabView);    }    /*     * Attach the BadgeView to the target view     *      * @param target the view to attach the BadgeView     */    public void setTargetView(View target) {        if (getParent() != null) {            ((ViewGroup) getParent()).removeView(this);        }        if (target == null) {            return;        }        if (target.getParent() instanceof FrameLayout) {            ((FrameLayout) target.getParent()).addView(this);        } else if (target.getParent() instanceof ViewGroup) {            // use a new Framelayout container for adding badge            ViewGroup parentContainer = (ViewGroup) target.getParent();            int groupIndex = parentContainer.indexOfChild(target);            parentContainer.removeView(target);            FrameLayout badgeContainer = new FrameLayout(getContext());            ViewGroup.LayoutParams parentlayoutParams = target.getLayoutParams();            parentContainer.addView(badgeContainer, groupIndex, parentlayoutParams);            badgeContainer.addView(target);            badgeContainer.addView(this);        } else if (target.getParent() == null) {            Log.e(getClass().getSimpleName(), "ParentView is needed");        }    }    /*     * converts dip to px     */    private int dip2Px(float dip) {        return (int) (dip * getContext().getResources().getDisplayMetrics().density + 0.5f);    }}



需要源码包点这里:

http://yunpan.cn/cycnVWIfEI8YJ  访问密码 135a



0 0
原创粉丝点击