十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
可以使用这样的一个xml布局
创新互联建站-专业网站定制、快速模板网站建设、高性价比洪江网站开发、企业建站全套包干低至880元,成熟完善的模板库,直接使用。一站式洪江网站制作公司更省心,省钱,快速模板网站建设找我们,业务覆盖洪江地区。费用合理售后完善,十载实体公司更值得信赖。
?xml version="1.0" encoding="utf-8"?
selector xmlns:android=""
// 获取焦点时候按钮的背景状态
item android:drawable="@drawable/btn_green_pressed" android:state_enabled="true" android:state_focused="true"/
// 被按下时候按钮的背景状态
item android:drawable="@drawable/btn_green_pressed" android:state_enabled="true" android:state_pressed="true"/
//正常状态下按钮的状态
item android:drawable="@drawable/btn_green_normal"/
/selector
把按钮的背景设置为这个布局引用就行了.试试吧骚年
需要两张图(分别是最上端的横杠,下面五个挂饰取一个(包括那根绳子,绳子+木牌应该做成一张图)),一个背景(目测是暗红色的)
用
LinearLayout xmlns:android=""
xmlns:tools=""
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#5C4033"
tools:context="com.example.baiduwenti.MainActivity"
FrameLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
ImageView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@drawable/zzz" /
LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_horizontal"
android:orientation="horizontal"
ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginRight="10dp"
android:background="@drawable/zz" /
ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginRight="10dp"
android:background="@drawable/zz" /
ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginRight="10dp"
android:background="@drawable/zz" /
ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginRight="10dp"
android:background="@drawable/zz" /
ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/zz" /
/LinearLayout
/FrameLayout
/LinearLayout
这是android中的viewPager中常用的一种效果
例如APP首次启动的欢迎界面,通常都会带几个这种小点,用于告诉用户,当前是第几个界面
实效果如下:
android.support.v4.ViewPager类在 API 4+ Support 支持包中开始为我们提供,它可以让我们有能力左右滑动以'页'的形式展示数据。我们可以通过继承 PagerAdapter 来生成页面形式的视图。介绍具体的使用方式之前先来看下效果
2.实现代码:
首先需要在layout文件中配置ViewPager View
android.support.v4.view.ViewPager
android:id="@+id/pager"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginBottom="50dp" /
3.Activity的实现代码
public class MainActivity extends Activity {
ArrayListView mViewList = new ArrayListView();
LayoutInflater mLayoutInflater;
LinearLayout mNumLayout;
Button mPreSelectedBt;
MyPagerAdapter mPagerAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mLayoutInflater = getLayoutInflater();
//可以按照需求进行动态创建Layout,这里暂用静态的xml layout
mViewList.add(mLayoutInflater.inflate(R.layout.per_pager1, null));
mViewList.add(mLayoutInflater.inflate(R.layout.per_pager2, null));
mViewList.add(mLayoutInflater.inflate(R.layout.per_pager3, null));
ViewPager viewPager = (ViewPager) findViewById(R.id.pager);
mPagerAdapter = new MyPagerAdapter();
viewPager.setAdapter(mPagerAdapter);
mNumLayout = (LinearLayout) findViewById(R.id.ll_pager_num);
Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.icon_dot_normal);
for (int i = 0; i mViewList.size(); i++) {
Button bt = new Button(this);
bt.setLayoutParams(new ViewGroup.LayoutParams(bitmap.getWidth(),bitmap.getHeight()));
bt.setBackgroundResource(R.drawable.icon_dot_normal);
mNumLayout.addView(bt);
}
viewPager.setOnPageChangeListener(new OnPageChangeListener() {
@Override
public void onPageSelected(int position) {
if(mPreSelectedBt != null){
mPreSelectedBt.setBackgroundResource(R.drawable.icon_dot_normal);
}
Button currentBt = (Button)mNumLayout.getChildAt(position);
currentBt.setBackgroundResource(R.drawable.home_page_dot_select);
mPreSelectedBt = currentBt;
//Log.i("INFO", "current item:"+position);
}
@Override
public void onPageScrolled(int arg0, float arg1, int arg2) {
// TODO Auto-generated method stub
}
@Override
public void onPageScrollStateChanged(int arg0) {
// TODO Auto-generated method stub
}
});
}
class MyPagerAdapter extends PagerAdapter{
@Override
public int getCount() {
return mViewList.size();
}
@Override
public Object instantiateItem(View container, int position) {
Log.i("INFO", "instantiate item:"+position);
((ViewPager) container).addView(mViewList.get(position),0);
return mViewList.get(position);
}
@Override
public void destroyItem(View container, int position, Object object) {
Log.i("INFO", "destroy item:"+position);
((ViewPager) container).removeView(mViewList.get(position));
}
@Override
public boolean isViewFromObject(View arg0, Object arg1) {
return arg0 == arg1;
}
}
}
有关viewPager + Adapter的更多用法,建议查看使用教程
Android自带的跑马灯效果不太好控制,不能控制速度,不能即时停止和启动,而且还受焦点的影响蛋疼不已。由于项目需求需要用的可控制性高的跑马灯效果,所以自己写了一个自定义的TextView
注意:在布局文件引用本view时,paddingLeft,paddingRigh都必须为0dp,需要增加这两个属性的,大家可以自行修改代码。
android:ellipsize="marquee" android:singleLine="true" 这两个属性也要加上
public class MarqueeText extends TextView implements Runnable {
private int currentScrollX;// 当前滚动的位置
private boolean isStop = false;
private int textWidth;
private boolean isMeasure = false;
public MarqueeText(C
ontext context) {
super(context);
// TODO Auto-generated constructor stub
}
public MarqueeText(Context context, AttributeSet attrs) {
super(context, attrs);
}
public MarqueeText(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
@Override
protected void onDraw(Canvas canvas) {
// TODO Auto-generated method stub
super.onDraw(canvas);
if (!isMeasure) {// 文字宽度只需获取一次就可以了
getTextWidth();
isMeasure = true;
}
}
/**
* 获取文字宽度
*/
private void getTextWidth() {
Paint paint = this.getPaint();
String str = this.getText().toString();
textWidth = (int) paint.measureText(str);
}
@Override
public void run() {
currentScrollX -= 2;// 滚动速度
scrollTo(currentScrollX, 0);
if (isStop) {
return;
}
if (getScrollX() = -(this.getWidth())) {
scrollTo(textWidth, 0);
currentScrollX = textWidth;
// return;
}
postDelayed(this, 5);
}
// 开始滚动
public void startScroll() {
isStop = false;
this.removeCallbacks(this);
post(this);
}
// 停止滚动
public void stopScroll() {
isStop = true;
}
// 从头开始滚动
public void startFor0() {
currentScrollX = 0;
startScroll();
}
}布局文件:
LinearLayout xmlns:android=""
xmlns:tools=""
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical"
Button
android:id="@+id/start"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="start"
android:text="走起" /
Button android:id="@+id/stop" android:layout_width="wrap_content" android:layout_height="wrap_content" android:onClick="stop" android:text="停止" / Button android:id="@+id/startfor0" android:layout_width="wrap_content" android:layout_height="wrap_content" android:onClick="startFor0" android:text="从头开始" / simtice.demo.marqueetext.MarqueeText android:id="@+id/test" android:layout_width="fill_parent" android:layout_height="wrap_content" android:background="#339320" android:ellipsize="marquee" android:singleLine="true" android:text="这才是真正的文字跑马灯效果这才是真正的字跑马灯效果这才是真正的" android:textColor="#000000" android:textSize="20dp" /simtice.demo.marqueetext.MarqueeText/LinearLayoutMainActivitypublic class MainActivity extends Activity { private MarqueeText test; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); test = (MarqueeText) this.findViewById(R.id.test); } public void start(View v) { test.startScroll(); } public void stop(View v) { test.stopScroll(); } public void startFor0(View v){ test.startFor0(); }}
implementation'com.github.bumptech.glide:glide:4.7.1'
implementation'jp.wasabeef:glide-transformations:4.0.1'
Glide.with(this).load(url)
.apply(RequestOptions.bitmapTransform(new BlurTransformation(5,2)))
.into(civ);
if(Build.VERSION.SDK_INT = Build.VERSION_CODES.HONEYCOMB){
//View从API Level 11才加入setLayerType方法 //设置View以软件渲染模式绘图
tvPhone.setLayerType(View.LAYER_TYPE_SOFTWARE,null);
}
SpannableString stringBuilder=new SpannableString("文字模糊");
stringBuilder.setSpan(new MaskFilterSpan(new BlurMaskFilter(10f,BlurMaskFilter.Blur.NORMAL)),
0,stringBuilder.length(), Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
tvPhone.setText(stringBuilder);
最后来张效果图吧:
思路: 通过 handler 做动画,隔一段时间在IMAGEVIEW中换一张图片。
private int[] noa = new int[] { R.drawable.green1, R.drawable.green2,
R.drawable.green3 };
/**
* 动画线程
*/
private Handler handler = new Handler();
private Runnable task = new Runnable() {
public void run() {
mMark.setImg(noa[noi]);
mMark.invalidate();
if (noi == 2) {
noi = 0;
} else {
noi++;
}
handlerTea.postDelayed(task, 800);
}
};