安卓——关于一些ui界面设置(直续更新ing)
发布日期:2021-06-29 11:11:52
浏览次数:3
分类:技术文章
本文共 21918 字,大约阅读时间需要 73 分钟。
1;关于Listview中的Item设置成某个图片样子。
效果图 图文件; 代码;在适配器中的getView操作2;界面设置背景
3;设置这种按钮
//在layout文件中的Botton设置 android:background=”@drawable/bg_alibuybutton” 建立四个xml文件4;ToggleButton按钮设置
效果图 layout文件中button设置 android:background=”@drawable/bg_button” 三个xml文件;5;显示popupWindow悬浮框
点击参数设置,弹出悬浮框 在点击事件中调用showSettingPopwindow这个方法;/** * 显示popupWindow悬浮框 */ private void showSettingPopwindow() { // 利用layoutInflater获得View LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE); View view = inflater.inflate(R.layout.popwindow_setting, null); // 下面是两种方法得到宽度和高度 getWindow().getDecorView().getWidth() final PopupWindow window = new PopupWindow(view, WindowManager.LayoutParams.MATCH_PARENT, 1500); // 设置popWindow弹出窗体可点击,这句话必须添加,并且是true window.setFocusable(true); // 实例化一个ColorDrawable颜色为半透明0xb00000 ColorDrawable dw = new ColorDrawable(0xb00000); window.setBackgroundDrawable(dw); // 设置popWindow的显示和消失动画 window.setAnimationStyle(R.style.mypopwindow_anim_style); // 在底部显示,第一个参数是parent,不是在其中显示,而是通过子控件找到主窗体,随便一个子控件都行 window.showAtLocation(Connect_sthsaActivity.this.findViewById(R.id.connect_tb), Gravity.BOTTOM, 0, 0); // 获取控件 time_et = (EditText) view.findViewById(R.id.time_et); temHumIp_et = (EditText) view.findViewById(R.id.temHumIp_et); temHumPort_et = (EditText) view.findViewById(R.id.temHumPort_et); smokeIp_et = (EditText) view.findViewById(R.id.smokeIp_et); smokePort_et = (EditText) view.findViewById(R.id.smokePort_et); fanIp_et = (EditText) view.findViewById(R.id.fanIp_et); fanPort_et = (EditText) view.findViewById(R.id.fanPort_et); tubeIp_et = (EditText) view.findViewById(R.id.tubeIp_et); tubePort_et = (EditText) view.findViewById(R.id.tubePort_et); buzzerIp_et = (EditText) view.findViewById(R.id.buzzerIp_et); buzzerPort_et = (EditText) view.findViewById(R.id.buzzerPort_et); cancel = (Button) view.findViewById(R.id.cancelBtn); confirm = (Button) view.findViewById(R.id.confirmBtn); // 初始化界面 smokeIp_et.setText(Const.SMOKE_IP); smokePort_et.setText(String.valueOf(Const.SMOKE_PORT)); temHumIp_et.setText(Const.TEMHUM_IP); temHumPort_et.setText(String.valueOf(Const.TEMHUM_PORT)); fanIp_et.setText(Const.FAN_IP); fanPort_et.setText(String.valueOf(Const.FAN_PORT)); tubeIp_et.setText(Const.TUBE_IP); tubePort_et.setText(String.valueOf(Const.TUBE_PORT)); buzzerIp_et.setText(Const.BUZZER_IP); buzzerPort_et.setText(String.valueOf(Const.BUZZER_PORT)); time_et.setText(String.valueOf(Const.time)); // 点击事件 // 取消 cancel.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { window.dismiss(); } }); // 确定 confirm.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // 获取采集周期、IP、端口、上下限 String SMOKE_IP = smokeIp_et.getText().toString().trim(); String SMOKE_PORT = smokePort_et.getText().toString().trim(); String TEMHUM_IP = temHumIp_et.getText().toString().trim(); String TEMHUM_PORT = temHumPort_et.getText().toString().trim(); String FAN_IP = fanIp_et.getText().toString().trim(); String FAN_PORT = fanPort_et.getText().toString().trim(); String TUBE_IP = tubeIp_et.getText().toString().trim(); String TUBE_PORT = tubePort_et.getText().toString().trim(); String BUZZER_IP = buzzerIp_et.getText().toString().trim(); String BUZZER_PORT = buzzerPort_et.getText().toString().trim(); String time = time_et.getText().toString().trim(); if (checkIpPort(SMOKE_IP, SMOKE_PORT) && checkIpPort(TEMHUM_IP, TEMHUM_PORT) && checkIpPort(FAN_IP, FAN_PORT) && time != null && time != "") { Const.SMOKE_IP = SMOKE_IP; Const.SMOKE_PORT = Integer.parseInt(SMOKE_PORT); Const.TEMHUM_IP = TEMHUM_IP; Const.TEMHUM_PORT = Integer.parseInt(TEMHUM_PORT); Const.FAN_IP = FAN_IP; Const.FAN_PORT = Integer.parseInt(FAN_PORT); Const.TUBE_IP = TUBE_IP; Const.TUBE_PORT = Integer.parseInt(TUBE_PORT); Const.BUZZER_IP = BUZZER_IP; Const.BUZZER_PORT = Integer.parseInt(BUZZER_PORT); Const.time = Integer.parseInt(time); } else { Toast.makeText(context, "配置信息不正确,请重输!", Toast.LENGTH_SHORT).show(); return; } window.dismiss(); } }); }
//放入style中的。
然后就是两个xml文件;popshow_anim和pophidden_anim
6;红点点,其实就是一个textView但是看效果图,但是用法就当时textView,通过id来使用;
来显示数字; 看代码布局; 代码;//layout文件中。
//clean_anim文件;
//com.xinlan.dragindicator包中的是三个类
package com.xinlan.dragindicator;import com.fro.market_peoplecalculatecase.R;import android.animation.Animator;import android.animation.AnimatorListenerAdapter;import android.animation.ValueAnimator;import android.annotation.TargetApi;import android.app.Activity;import android.content.Context;import android.graphics.Canvas;import android.graphics.Color;import android.graphics.Paint;import android.graphics.Path;import android.graphics.drawable.AnimationDrawable;import android.graphics.drawable.Drawable;import android.os.Build;import android.util.AttributeSet;import android.util.Log;import android.util.TypedValue;import android.view.Gravity;import android.view.MotionEvent;import android.view.View;import android.view.ViewGroup;import android.view.ViewParent;import android.view.animation.OvershootInterpolator;import android.widget.ImageView;import android.widget.TextView;/** * 可拖拽的红点提示 * * Created by panyi on 2016/3/31. */public class DragIndicatorView extends TextView { private static int DRAW_COLOR = Color.RED; //private static int DEFAULT_DISTANCE = 200; private static float DEFAULT_VISCOUS_VALUE = 0.15f;//粘滞系数 private Paint mPaint; private int mRadius = 0; private float mViscous = DEFAULT_VISCOUS_VALUE; private float mOriginX = 0; private float mOriginY = 0; private int mCenterX = 0; private int mCenterY = 0; private float mDx = 0; private float mDy = 0; //private int mDismissDetectDistance = DEFAULT_DISTANCE;//超过此距离 判定为让提示View消失 private ViewGroup mRootView;//根布局视图 作为画板使用 private DragIndicatorView mCloneView; private ViewParent mParentView; private SpringView mSpringView; private OnIndicatorDismiss mOnDismissAction; public DragIndicatorView(Context context) { super(context); initView(context); } public DragIndicatorView(Context context, AttributeSet attrs) { super(context, attrs); initView(context); } public DragIndicatorView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); initView(context); } public DragIndicatorView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { super(context, attrs, defStyleAttr); initView(context); } private void initView(Context context) { setGravity(Gravity.CENTER);//内容居中 mPaint = new Paint(); mPaint.setColor(DRAW_COLOR); mPaint.setAntiAlias(true); if (context instanceof Activity) { mRootView = (ViewGroup) ((Activity) context).getWindow().getDecorView(); } //System.out.println("init View"); } @Override public void setBackgroundResource(int resid) { showCannotSetBgErrorLog(); } @Override public void setBackground(Drawable background) { showCannotSetBgErrorLog(); } @Override public void setBackgroundColor(int color) { showCannotSetBgErrorLog(); } private void showCannotSetBgErrorLog() { Log.e("error", "This drag indicator view can not set custom background"); } @Override protected void onDraw(Canvas canvas) { drawBackground(canvas); super.onDraw(canvas); } /** * draw circle background * * @param canvas */ private void drawBackground(Canvas canvas) { mRadius = Math.min(getMeasuredWidth(), getMeasuredHeight()) >> 1; canvas.drawCircle(getWidth() >> 1, getHeight() >> 1, mRadius, mPaint); } @Override public boolean onTouchEvent(MotionEvent event) { switch (event.getAction()) { case MotionEvent.ACTION_DOWN: //System.out.println("down"); if (mParentView == null) { mParentView = getScrollableParent(); } if (mParentView != null) { //屏蔽父控件的事件响应 mParentView.requestDisallowInterceptTouchEvent(true); } mDx = event.getX(); mDy = event.getY(); mOriginX = event.getRawX() - mDx + (getWidth() >> 1); mOriginY = event.getRawY() - mDy + (getHeight() >> 1); break; case MotionEvent.ACTION_MOVE: //System.out.println("move"); if (getVisibility() == View.VISIBLE) { setVisibility(View.INVISIBLE); mSpringView = new SpringView(this.getContext()); mSpringView.initSpring(mOriginX, mOriginY, mRadius, getWidth(), getHeight()); mRootView.addView(mSpringView); mCloneView = cloneSelfView(); mRootView.addView(mCloneView, getLayoutParams()); }//end if if (mCloneView != null) { mCloneView.setX(event.getRawX() - mDx); mCloneView.setY(event.getRawY() - mDy); mCloneView.invalidate(); } //拉伸水滴效果 if (mSpringView != null) { //更新弹性控件 mSpringView.update(event.getRawX() - mDx, event.getRawY() - mDy); } break; case MotionEvent.ACTION_CANCEL: case MotionEvent.ACTION_UP: //System.out.println("up"); //判断是否dismiss View// if (mSpringView != null && mSpringView.radius <= 0) { //如果拖动超过会消失 if (false) { killView(event.getRawX(), event.getRawY()); mRootView.removeView(mSpringView); mSpringView = null; if (mCloneView != null) { mRootView.removeView(mCloneView); mCloneView = null; } } else { //不取消 // TODO: 2016/3/31 显示回弹效果动画 恢复View可见 //setVisibility(View.VISIBLE); if (mSpringView != null && mSpringView.spring_len > 1f) { //存在弹性势能 显示弹性动画效果 mSpringView.startSpringAction(); } else { resetView(); } } if (mParentView != null) { //恢复父控件对事件的处理 mParentView.requestDisallowInterceptTouchEvent(false); } break; }//end switch return true; } private void resetView() { if (mCloneView != null) { mRootView.removeView(mCloneView); } if (mSpringView != null) { mRootView.removeView(mSpringView); } setVisibility(View.VISIBLE); } /** * 获得父控件 * * @return */ private ViewGroup getScrollableParent() { View target = this; while (true) { View parent; try { parent = (View) target.getParent(); } catch (Exception e) { return null; } if (parent == null) return null; if (parent instanceof ViewGroup) { return (ViewGroup) parent; } target = parent; }//end while } /** * 手动控制 提示按钮按钮不可见 */ public void dismissView() { if (getVisibility() == View.VISIBLE) { int[] screens = new int[2]; getLocationOnScreen(screens); killView(screens[0] + (getWidth() >> 1), screens[1] + (getHeight() >> 1)); }//end if } protected void killView(final float x, final float y) { final ImageView imageView = new ImageView(getContext()); imageView.setImageResource(R.drawable.clean_anim); mRootView.addView(imageView, new ViewGroup.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT)); imageView.post(new Runnable() { @Override public void run() { imageView.setX(x - (imageView.getMeasuredWidth() >> 1)); imageView.setY(y - (imageView.getMeasuredHeight() >> 1)); } }); AnimationDrawable animationDrawable = (AnimationDrawable) imageView.getDrawable(); int totalDuring = 0; for (int i = 0, len = animationDrawable.getNumberOfFrames(); i < len; i++) { totalDuring += animationDrawable.getDuration(i); } animationDrawable.start(); //动画播放结束后 移除ImageView postDelayed(new Runnable() { @Override public void run() { mRootView.removeView(imageView); } }, totalDuring + 20); if (mOnDismissAction != null) { mOnDismissAction.OnDismiss(this); } setVisibility(View.GONE); } /** * 产生一个自己的备份 * * @return */ protected DragIndicatorView cloneSelfView() { DragIndicatorView textView = new DragIndicatorView(getContext()); textView.setText(getText()); textView.setTextColor(getTextColors()); textView.setTextSize(TypedValue.COMPLEX_UNIT_PX, getTextSize()); textView.setGravity(getGravity()); textView.setPadding(getPaddingLeft(), getPaddingTop(), getPaddingRight(), getPaddingBottom()); textView.setEnabled(false); return textView; } /** * 获取粘滞系数 * * @return */ public float getViscous() { return mViscous; } /** * 设置粘滞系数 * * @param mViscous */ public void setViscous(float mViscous) { this.mViscous = mViscous; } public interface OnIndicatorDismiss { void OnDismiss(DragIndicatorView view); } public void setOnDismissAction(OnIndicatorDismiss mOnDismissAction) { this.mOnDismissAction = mOnDismissAction; } /** * */ private final class SpringView extends View { public float from_x; public float from_y; public float radius; public float to_x; public float to_y; public float toWidth; public float toHeight; private Path mPath = new Path(); boolean isSpringAction = false; float cur_x; float cur_y; float spring_len = 0; float origin_len = 0; ValueAnimator mSpringAnimation; public SpringView(Context context) { super(context); isSpringAction = false; } public void initSpring(float init_x, float init_y, float r, float w, float h) { this.from_x = init_x; this.from_y = init_y; this.to_x = init_x; this.to_y = init_y; this.radius = r; this.toWidth = w; this.toHeight = h; } @Override protected void onDraw(Canvas canvas) { if (radius > 0) { canvas.drawPath(mPath, mPaint);//draw path canvas.drawCircle(from_x, from_y, radius, mPaint); }//end if } public void update(float x, float y) { this.to_x = x; this.to_y = y; //目的圆 球心坐标 float dest_x = to_x + toWidth / 2; float dest_y = to_y + toHeight / 2; updatePosition(dest_x, dest_y); } private void updatePosition(final float dest_x, final float dest_y) { this.cur_x = dest_x; this.cur_y = dest_y; float deltaX = 0; float deltaY = 0; if (dest_y >= from_y) { deltaX = dest_x - from_x; deltaY = dest_y - from_y; } else { deltaX = from_x - dest_x; deltaY = from_y - dest_y; }//end if float distance = (float) Math.sqrt(deltaX * deltaX + deltaY * deltaY); //radius = (float)mRadius/(distance + 1); // r = R - R * (1 -1/d)); radius = mRadius - mViscous * distance; if (radius < 0.2f * mRadius) { radius = 0; } if (radius > 0) { // (1 , 0) (x,y) double cos_delta = deltaX / distance; double angle = Math.acos(cos_delta); double circle_from_thela1 = angle + Math.PI / 2; double circle_from_thela2 = circle_from_thela1 + Math.PI; float circle_from_circle_x1 = (float) (from_x + radius * Math.cos(circle_from_thela1)); float circle_from_circle_y1 = (float) (from_y + radius * Math.sin(circle_from_thela1)); float circle_from_circle_x2 = (float) (from_x + radius * Math.cos(circle_from_thela2)); float circle_from_circle_y2 = (float) (from_y + radius * Math.sin(circle_from_thela2)); float circle_to_circle_x1 = (float) (dest_x + mRadius * Math.cos(circle_from_thela1)); float circle_to_circle_y1 = (float) (dest_y + mRadius * Math.sin(circle_from_thela1)); float circle_to_circle_x2 = (float) (dest_x + mRadius * Math.cos(circle_from_thela2)); float circle_to_circle_y2 = (float) (dest_y + mRadius * Math.sin(circle_from_thela2)); mPath.reset(); mPath.moveTo(circle_from_circle_x1, circle_from_circle_y1); mPath.lineTo(circle_from_circle_x2, circle_from_circle_y2); mPath.quadTo((from_x + dest_x) / 2, (from_y + dest_y) / 2, circle_to_circle_x2, circle_to_circle_y2); //mPath.lineTo(dest_x,dest_y); //mPath.lineTo(circle_to_circle_x2, circle_to_circle_y2); mPath.lineTo(circle_to_circle_x1, circle_to_circle_y1); mPath.quadTo((from_x + dest_x) / 2, (from_y + dest_y) / 2, circle_from_circle_x1, circle_from_circle_y1); mPath.close(); if (mCloneView != null) { mCloneView.setX(cur_x - toWidth / 2); mCloneView.setY(cur_y - toHeight / 2); } spring_len = distance; } else { spring_len = 0; } invalidate(); } /** * 做回弹操作 */ public void startSpringAction() { isSpringAction = true; origin_len = spring_len; if (mSpringAnimation != null) { mSpringAnimation.cancel(); } mSpringAnimation = ValueAnimator.ofObject(new PointEvaluator(), new Point(cur_x, cur_y), new Point(from_x, from_y)); mSpringAnimation.setDuration(120); mSpringAnimation.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { @Override public void onAnimationUpdate(ValueAnimator animation) { Point p = (Point) animation.getAnimatedValue(); updatePosition(p.getX(), p.getY()); //invalidate(); } }); mSpringAnimation.addListener(new AnimatorListenerAdapter() { @Override public void onAnimationEnd(Animator animation) { resetView(); } }); mSpringAnimation.setInterpolator(new OvershootInterpolator(5)); mSpringAnimation.start(); postInvalidate(); } }//end inner class}//end class
package com.xinlan.dragindicator;/** * Created by panyi on 16/4/5. */public class Point { private float x; private float y; public Point(float x, float y) { this.x = x; this.y = y; } public float getX() { return x; } public float getY() { return y; }}//end class
package com.xinlan.dragindicator;import android.animation.TypeEvaluator;/** * Created by panyi on 16/4/5. * */public class PointEvaluator implements TypeEvaluator{ @Override public Point evaluate(float fraction, Point startValue, Point endValue) { float x = startValue.getX() + fraction * (endValue.getX() - startValue.getX()); float y = startValue.getY() + fraction * (endValue.getY() - startValue.getY()); Point point = new Point(x, y); return point; }}//end class
转载地址:https://blog.csdn.net/zw1996/article/details/75174249 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
逛到本站,mark一下
[***.202.152.39]2024年04月04日 19时44分04秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
Mysql创建定时任务
2019-04-29
MYSQL时间与时间时间不符
2019-04-29
Hibernate事务提交缓慢
2019-04-29
IDEA HTTP Client使用
2019-04-29
OptionalStr工具类
2019-04-29
SSM+boostrap table实现模糊搜索
2019-04-29
VM下安装CentOS 7并使用Xshell终端连接
2019-04-29
centos7yum安装tomcat
2019-04-29
Git常用命令使用大全
2019-04-29
JAVA_随笔
2019-04-29
Java基础知识 -- 多线程
2019-04-29
Java中关键字synchronized用法
2019-04-29
spring的控制反转IOC
2019-04-29
mqsql 查看sql执行时间
2019-04-29
JAVA的mapToBean及beanToMap工具类
2019-04-29
说说hashCode()和equals()的相关问题
2019-04-29
C# .NET多线程之Task的使用
2019-04-29
C# .NET调用微信模板消息接口
2019-04-29
.Net Framework Cookie 和 JS localStorage使用
2019-04-29
C# Azure Oauth 2.0授权流以及调用Azure REST API
2019-04-29