app安卓开发

安卓教程文档

2021-01-21  本文已影响0人  忘記了天色

2020原生Android基础实用开发

1、环境配置

https://developer.android.google.cn/studio/

2、简单熟悉Android sudio开发工具

3、文本TextView的使用

4、按钮Button的使用

5、输入框EditText的使用

6、复选框CheckBox\单选框RadioButton的使用

7、下拉框Spinner使用

8、图片ImageView的使用

9、布局layout的使用

10、完成登录界面&&头部Toolbar的使用

startActivity(new Intent(getApplicationContext(),EditTextTest.class));

11、列表ListView的使用(上)

适配器

12、列表ListView的使用(下)&&优化界面跳转

13、横向列表HorizontalListView(自定义View)的使用

public class HorizontalListView extends AdapterView<ListAdapter> {

    float startX;
    float startY;
    public boolean mAlwaysOverrideTouch = true;
    protected ListAdapter mAdapter;
    private int mLeftViewIndex = -1;
    private int mRightViewIndex = 0;
    protected int mCurrentX;
    protected int mNextX;
    private int mMaxX = Integer.MAX_VALUE;
    private int mDisplayOffset = 0;
    protected Scroller mScroller;
    private GestureDetector mGesture;
    private Queue<View> mRemovedViewQueue = new LinkedList<View>();
    private OnItemSelectedListener mOnItemSelected;
    private OnItemClickListener mOnItemClicked;
    private OnItemLongClickListener mOnItemLongClicked;
    private boolean mDataChanged = false;


    public HorizontalListView(Context context, AttributeSet attrs) {
        super(context, attrs);
        initView();
    }

    private synchronized void initView() {
        mLeftViewIndex = -1;
        mRightViewIndex = 0;
        mDisplayOffset = 0;
        mCurrentX = 0;
        mNextX = 0;
        mMaxX = Integer.MAX_VALUE;
        mScroller = new Scroller(getContext());
        mGesture = new GestureDetector(getContext(), mOnGesture);
    }

    @Override
    public void setOnItemSelectedListener(OnItemSelectedListener listener) {
        mOnItemSelected = listener;
    }

    @Override
    public void setOnItemClickListener(OnItemClickListener listener) {
        mOnItemClicked = listener;
    }

    @Override
    public void setOnItemLongClickListener(OnItemLongClickListener listener) {
        mOnItemLongClicked = listener;
    }

    private DataSetObserver mDataObserver = new DataSetObserver() {

        @Override
        public void onChanged() {
            synchronized (HorizontalListView.this) {
                mDataChanged = true;
            }
            invalidate();
            requestLayout();
        }

        @Override
        public void onInvalidated() {
            reset();
            invalidate();
            requestLayout();
        }
    };

    @Override
    public ListAdapter getAdapter() {
        return mAdapter;
    }

    @Override
    public View getSelectedView() {
        return null;
    }

    @Override
    public void setAdapter(ListAdapter adapter) {
        if (mAdapter != null) {
            mAdapter.unregisterDataSetObserver(mDataObserver);
        }
        mAdapter = adapter;
        mAdapter.registerDataSetObserver(mDataObserver);
        reset();
    }

    private synchronized void reset() {
        initView();
        removeAllViewsInLayout();
        requestLayout();
    }

    @Override
    public void setSelection(int position) {
    }

    private void addAndMeasureChild(final View child, int viewPos) {
        LayoutParams params = child.getLayoutParams();
        if (params == null) {
            params = new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT);
        }

        addViewInLayout(child, viewPos, params, true);
        child.measure(MeasureSpec.makeMeasureSpec(getWidth(), MeasureSpec.AT_MOST),
                MeasureSpec.makeMeasureSpec(getHeight(), MeasureSpec.AT_MOST));
    }

    @Override
    protected synchronized void onLayout(boolean changed, int left, int top, int right, int bottom) {
        super.onLayout(changed, left, top, right, bottom);

        if (mAdapter == null) {
            return;
        }

        if (mDataChanged) {
            int oldCurrentX = mCurrentX;
            initView();
            removeAllViewsInLayout();
            mNextX = oldCurrentX;
            mDataChanged = false;
        }

        if (mScroller.computeScrollOffset()) {
            int scrollx = mScroller.getCurrX();
            mNextX = scrollx;
        }

        if (mNextX <= 0) {
            mNextX = 0;
            mScroller.forceFinished(true);
        }
        if (mNextX >= mMaxX) {
            mNextX = mMaxX;
            mScroller.forceFinished(true);
        }

        int dx = mCurrentX - mNextX;

        removeNonVisibleItems(dx);
        fillList(dx);
        positionItems(dx);

        mCurrentX = mNextX;

        if (!mScroller.isFinished()) {
            post(new Runnable() {
                @Override
                public void run() {
                    requestLayout();
                }
            });
        }
    }

    private void fillList(final int dx) {
        int edge = 0;
        View child = getChildAt(getChildCount() - 1);
        if (child != null) {
            edge = child.getRight();
        }
        fillListRight(edge, dx);

        edge = 0;
        child = getChildAt(0);
        if (child != null) {
            edge = child.getLeft();
        }
        fillListLeft(edge, dx);
    }

    private void fillListRight(int rightEdge, final int dx) {
        while (rightEdge + dx < getWidth() && mRightViewIndex < mAdapter.getCount()) {
            View child = mAdapter.getView(mRightViewIndex, mRemovedViewQueue.poll(), this);
            addAndMeasureChild(child, -1);
            rightEdge += child.getMeasuredWidth();
            if (mRightViewIndex == mAdapter.getCount() - 1) {
                mMaxX = mCurrentX + rightEdge - getWidth();
            }
            if (mMaxX < 0) {
                mMaxX = 0;
            }
            mRightViewIndex++;
        }
    }
    private void fillListLeft(int leftEdge, final int dx) {
        while (leftEdge + dx > 0 && mLeftViewIndex >= 0) {
            View child = mAdapter.getView(mLeftViewIndex, mRemovedViewQueue.poll(), this);
            addAndMeasureChild(child, 0);
            leftEdge -= child.getMeasuredWidth();
            mLeftViewIndex--;
            mDisplayOffset -= child.getMeasuredWidth();
        }
    }

    private void removeNonVisibleItems(final int dx) {
        View child = getChildAt(0);
        while (child != null && child.getRight() + dx <= 0) {
            mDisplayOffset += child.getMeasuredWidth();
            mRemovedViewQueue.offer(child);
            removeViewInLayout(child);
            mLeftViewIndex++;
            child = getChildAt(0);

        }

        child = getChildAt(getChildCount() - 1);
        while (child != null && child.getLeft() + dx >= getWidth()) {
            mRemovedViewQueue.offer(child);
            removeViewInLayout(child);
            mRightViewIndex--;
            child = getChildAt(getChildCount() - 1);
        }
    }

    private void positionItems(final int dx) {
        if (getChildCount() > 0) {
            mDisplayOffset += dx;
            int left = mDisplayOffset;
            for (int i = 0; i < getChildCount(); i++) {
                View child = getChildAt(i);
                int childWidth = child.getMeasuredWidth();
                child.layout(left, 0, left + childWidth, child.getMeasuredHeight());
                left += childWidth + child.getPaddingRight();
            }
        }
    }
    public synchronized void scrollTo(int x) {
        mScroller.startScroll(mNextX, 0, x - mNextX, 0);
        requestLayout();
    }
    /**
     * 上下滑动需要拦截,
     */
    @Override
    public boolean dispatchTouchEvent(MotionEvent ev) {
        boolean handled = super.dispatchTouchEvent(ev);
        handled |= mGesture.onTouchEvent(ev);
        getParent().requestDisallowInterceptTouchEvent(true);
        switch (ev.getAction()) {
            case MotionEvent.ACTION_DOWN:
                startX = (int) ev.getX();
                startY = (int) ev.getY();
                break;
            case MotionEvent.ACTION_MOVE:
                int endX = (int) ev.getX();
                int endY = (int) ev.getY();
                int dx = (int) (endX - startX);
                int dy = (int) (endY - startY);
                if (Math.abs(dx) + 50 > Math.abs(dy)) {

                } else {
                    // 上下滑动,需要拦截
                    getParent().requestDisallowInterceptTouchEvent(false);
                }
                break;
            case MotionEvent.ACTION_UP:
                break;
        }
        return handled | super.dispatchTouchEvent(ev);
    }

    protected boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
                              float velocityY) {
        synchronized (HorizontalListView.this) {
            mScroller.fling(mNextX, 0, (int) -velocityX, 0, 0, mMaxX, 0, 0);
        }
        requestLayout();
        return true;
    }

    protected boolean onDown(MotionEvent e) {
        mScroller.forceFinished(true);
        return true;
    }

    private GestureDetector.OnGestureListener mOnGesture = new GestureDetector.SimpleOnGestureListener() {

        @Override
        public boolean onDown(MotionEvent e) {
            return HorizontalListView.this.onDown(e);
        }

        @Override
        public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
                               float velocityY) {
            return HorizontalListView.this.onFling(e1, e2, velocityX, velocityY);
        }

        @Override
        public boolean onScroll(MotionEvent e1, MotionEvent e2,
                                float distanceX, float distanceY) {

            synchronized (HorizontalListView.this) {
                mNextX += (int) distanceX;
            }
            requestLayout();
            return true;
        }

        @Override
        public boolean onSingleTapConfirmed(MotionEvent e) {
            for (int i = 0; i < getChildCount(); i++) {
                View child = getChildAt(i);
                if (isEventWithinView(e, child)) {
                    if (mOnItemClicked != null) {
                        mOnItemClicked.onItemClick(HorizontalListView.this, child, mLeftViewIndex + 1 + i, mAdapter.getItemId(mLeftViewIndex + 1 + i));
                    }
                    if (mOnItemSelected != null) {
                        mOnItemSelected.onItemSelected(HorizontalListView.this, child, mLeftViewIndex + 1 + i, mAdapter.getItemId(mLeftViewIndex + 1 + i));
                    }
                    break;
                }
            }
            return true;
        }
        @Override
        public void onLongPress(MotionEvent e) {
            int childCount = getChildCount();
            for (int i = 0; i < childCount; i++) {
                View child = getChildAt(i);
                if (isEventWithinView(e, child)) {
                    if (mOnItemLongClicked != null) {
                        mOnItemLongClicked.onItemLongClick(HorizontalListView.this, child, mLeftViewIndex + 1 + i, mAdapter.getItemId(mLeftViewIndex + 1 + i));
                    }
                    break;
                }
            }
        }
        private boolean isEventWithinView(MotionEvent e, View child) {
            Rect viewRect = new Rect();
            int[] childPosition = new int[2];
            child.getLocationOnScreen(childPosition);
            int left = childPosition[0];
            int right = left + child.getWidth();
            int top = childPosition[1];
            int bottom = top + child.getHeight();
            viewRect.set(left, top, right, bottom);
            return viewRect.contains((int) e.getRawX(), (int) e.getRawY());
        }
    };
    //解决滑动和点击冲突问题
    @Override
    public boolean onInterceptTouchEvent(MotionEvent ev) {
        switch (ev.getAction()) {
            case MotionEvent.ACTION_DOWN:
                startX = ev.getX();
                startY = ev.getY();
                break;
            case MotionEvent.ACTION_MOVE:
                float endX = ev.getX();
                float endY = ev.getY();
                float dx = endX - startX;
                float dy = endY - startY;
                if (Math.abs(dx) - 10 > Math.abs(dy)) {
                    return true;
                } else if (Math.abs(dx) < Math.abs(dy) - 10) {
                    return true;
                }
                break;
            case MotionEvent.ACTION_UP:
                break;
        }
        return super.onInterceptTouchEvent(ev);
    }
}
    <com.example.myapplication.customView.HorizontalListView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>

14、网格列表GridView的使用

15、静态进度条xxxBar的使用(上)

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >
    <!-- 进度条背景色 -->
    <item android:id="@android:id/background">
        <shape>
            <solid android:color="#03A9F4" />
        </shape>
    </item>
</layer-list>

16、动态进度条xxxBar+线程的使用(下)

17、网页显示WebView的使用

18、碎片界面Fragment的使用

https://www.jianshu.com/p/a4c51309bc19

19、轮播组件ViewPager的使用(上)

20、轮播组件ViewPager+Fragment+Tab的使用(下)

implementation 'com.android.support:design:23.1.1'
//---准备数据
final List<Fragment> list2 = new ArrayList<>();
list2.add(new Fragment01());
list2.add(new Fragment02());
//----设置显示
mPageViewVpTest.setAdapter(new FragmentStatePagerAdapter(getSupportFragmentManager()) {
    @NonNull
    @Override
    public Fragment getItem(int position) {
        return list2.get(position);
    }

    @Override
    public int getCount() {
        return list2.size();
    }

    @Nullable
    @Override
    public CharSequence getPageTitle(int position) {
        return titles.get(position);
    }
});

使用场景

  • 主页
  • 轮播图
  • 引导页面
  • ...
//---准备标题数据
final List<String> titles = new ArrayList<>();
titles.add("标题1");
titles.add("标题2");
//---重写适配器方法
@Nullable
@Override
public CharSequence getPageTitle(int position) {
    return titles.get(position);
}
//---设置关联
TabLayout.setupWithViewPager(viewPager);
FragmentPagerAdapter.BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT;

兼容以前那种方式实现的懒加载

21、侧滑菜单栏 SlidingPaneLayout||DrawerLayout 的使用

22、下拉刷新SwipeRefreshLayout的使用

23、测试网络接口-动态权限获取(上)

24、测试网络接口-Vollery网络调用+gson解析json数据(下)

25、Activity、Fragment+ViewPager的常用生命周期

26、交互对话框 Toast、Dialog、下弹框的使用

27、Animation动画、属性动画(上)

28、Animation动画、属性动画(下)

  + listView子级动画

  + 创建一个子级的组合动画: list_item_set_anim.xml

    ```xml
    <set xmlns:android="http://schemas.android.com/apk/res/android">
        <translate
                   android:fromXDelta="10%"
                   android:toXDelta="0%"
                   android:duration="500"/>
        <alpha
               android:fromAlpha="0.6"
               android:toAlpha="1"
               android:duration="500"/>
    </set>
    ```

    + 创建一个layoutAnimation父级动画:list_anim.xml

    ```xml
    <layoutAnimation android:animation="@anim/list_item_set_anim"
                     android:animationOrder="normal"
                     android:delay="0.5"
                     xmlns:android="http://schemas.android.com/apk/res/android">
    
    </layoutAnimation>
    ```

     > + animationOrder:子级显示模式
     >     >   + normal:按顺序
     >     >   + reverse:倒序
     >     >   + random:随机
     >     >   + delay:每个子级间隔
     >     >   + animation:子集动画

    + 最后给listView使用

    ```xml
    android:layoutAnimation="@anim/list_anim"
    ```

+ 跳转Activit使用动画

```java
Intent intent = new Intent();
intent.setClass(getApplicationContext(),Activity.class);
startActivity(intent);
overridePendingTransition(R.anim.anim_in,R.anim.anim_out);
```

  > 注意:
  >
  > + overridePendingTransition方法一定在startActivity后面
  > + overridePendingTransition:参数1:当前页面消失动画,参数2:下个页面进入动画

+ 普通模板跳转
+ 跳转页面

```java
startActivity(intent, ActivityOptions.makeSceneTransitionAnimation(ButtonTest.this).toBundle());
```

> 这个是默认自带的一个跳转

+ 设置接收动画

```java
 getWindow().setEnterTransition(new Explode());//需要接收动画
```

> 在跳转的界面接受即可

29、Media媒体播放音乐、视频

30、SensorManager传感器的使用(隐式跳转)(上)

https://blog.csdn.net/weixin_38379772/article/details/79069494

SensorManager mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);//获取传感器管理器
//创建一个SensorManager来获取系统的传感器服务
SensorManager  sm = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
    implements SensorEventListener{}
  @Override
    public void onSensorChanged(SensorEvent sensorEvent) {
        //监听回调
    }

    @Override
    public void onAccuracyChanged(Sensor sensor, int i) {

    }
List<Sensor> sensorList;
// 实例化传感器管理者

// 得到设置支持的所有传感器的List
sensorList = mSensorManager.getSensorList(Sensor.TYPE_ALL);
for (Sensor sensor : sensorList) {
    Log.d("FDFDS", "onResume: " + sensor.getName());
}

31、SensorManager传感器的使用(指纹+NFC)(下)

32、Service服务+广播的简单使用(理解)(上)

package com.example.t_world.service;


import androidx.annotation.NonNull;
import androidx.annotation.RequiresApi;
import androidx.localbroadcastmanager.content.LocalBroadcastManager;

public class MyService extends Service {

    @Override
    public void onDestroy() {
        super.onDestroy();
        Log.d(BasDataUtil.LOG_TOAST, "服务销毁;");
    }

    @Override
    public void onCreate() {
        super.onCreate();
        Log.d(BasDataUtil.LOG_TOAST, "服务创建----Create");
    }

    public MyService() {
        Log.d(BasDataUtil.LOG_TOAST, "实例化MyService服务");
    }

    @Override
    public IBinder onBind(Intent intent) {
        Log.d(BasDataUtil.LOG_TOAST, "服务----绑定成功");
        // TODO: Return the communication channel to the service.
        //返回到服务的通信通道。
        return new PlayMusicBinder();
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        try {
            String activityKey = intent.getStringExtra("data");
            if (activityKey!=null){
             //intent传入的参数接收
            }
        }catch (Exception e){
            Log.d(BasDataUtil.LOG_TOAST,"播放音乐服务--发广播/收广播错误:"+e.toString());
        }

        return super.onStartCommand(intent, flags, startId);
    }
    
    @Override
    public boolean onUnbind(Intent intent) {
        Log.d(BasDataUtil.LOG_TOAST, "解绑MyService成功");
        return super.onUnbind(intent);
    }
}

注意:

  • 启动服务调用的是onCreate

  • 关闭服务调用的是:onDestroy

  • 绑定服务调用的是onBind

  • 取消绑定调用的是:onUnbind

  • intent传参数跳转服务,需要接收使用:onStartCommand

    Intent intent = new Intent(this, MyService.class);  
    startService(intent);
    

33、service服务+广播的简单使用(交互)(下)

34、Android中的数据存储/传输(本地数据)(上)

int i;
String s;

使用范围:当前代码块

public static int i;
public static String s;

使用范围:跨类可以使用

35、Android中的数据存储/传输(Sqlite)(下)

      Dao<UserEntity, ?> dao = sqlitOrmHelper.getDao(UserEntity.class);
      UserEntity userEntity = new UserEntity();
      userEntity.setName("张三orm");
      userEntity.setPwd("张三orm");
      userEntity.setAge("2");
      dao.create(userEntity);
      List<UserEntity> userEntities = dao.queryForAll();
      Log.d(BaseData.LOG_TOAST,"查询成功:"+userEntities.toString());
      DeleteBuilder<UserEntity, ?> userEntityDeleteBuilder = dao.deleteBuilder();
      userEntityDeleteBuilder.where().eq("name","张三orm");
      userEntityDeleteBuilder.delete();
上一篇 下一篇

猜你喜欢

热点阅读