当前位置:  编程技术>移动开发
本页文章导读:
    ▪旋钮点击效果 父控件 响应事件        按钮点击效果 父控件 响应事件 tv.setClickable(false); tv.setDuplicateParentStateEnabled(true);   比如RelativeLayout里面有两个控件,一个是ImageView,一个是TextView,这时候想让RelativeLayout响应点击事件,那么.........
    ▪ ScrollView反弹成效实现[bug修正版]        ScrollView反弹效果实现[bug修正版] View中也有scrollBy和scrollTo这两个方法,但是ScrollView对scrollTo进行重写       由于:public void scrollBy(int x, int y) {         scrollTo(mScrollX + x, mScrollY + y);     }  .........
    ▪ ContentProvider的应用       ContentProvider的使用 红色字可以是任意字符串,但要保持一致。 <manifest .... >     <application android:icon="@drawable/icon" android:label="@string/app_name">         <provider android:name=".Per.........

[1]旋钮点击效果 父控件 响应事件
    来源: 互联网  发布时间: 2014-02-18
按钮点击效果 父控件 响应事件
tv.setClickable(false);
tv.setDuplicateParentStateEnabled(true);
 

比如RelativeLayout里面有两个控件,一个是ImageView,一个是TextView,这时候想让RelativeLayout响应点击事件,那么需要将ImageView,和TextView设置上面两个属性。RelativeLayout设置onClickListener即可

 


    
[2] ScrollView反弹成效实现[bug修正版]
    来源: 互联网  发布时间: 2014-02-18
ScrollView反弹效果实现[bug修正版]

View中也有scrollBy和scrollTo这两个方法,但是ScrollView对scrollTo进行重写  
    由于:public void scrollBy(int x, int y) {
        scrollTo(mScrollX + x, mScrollY + y);
    }
    View:public void scrollTo(int x, int y) {
        if (mScrollX != x || mScrollY != y) {
            int oldX = mScrollX;
            int oldY = mScrollY;
            mScrollX = x;
            mScrollY = y;
            onScrollChanged(mScrollX, mScrollY, oldX, oldY);
            if (!awakenScrollBars()) {
                invalidate();
            }
        }
    }
    所以也就相当于scrollBy和scrollTo这两个方法都被重写了。重写的代码中加入校验,当你移动到最上面或者最下面的时候无法再向上移动或向下 移动。这就导致了如果简单调用scrollTo无法实现继续移动。如果你还要继续移动的话mScrollY 就为0或者是你内部视图的测量高度-ScrollView的高度。scrollTo是移动到,scrollBy是移动了。如下图:
   
                所以内容向下移动,手指向上滑动,那这个deltaY 就为正,也就是mScrollY =mScrollY +deltaY ,mScrollY 变大直到移动到最下无法移动位置;反之mScrollY 变小直到为0移动到最上面为止。
                final float preY = y;
                float nowY = ev.getY();
                int deltaY = (int) (preY - nowY);
                // 滚动,deltaY 为移动的距离,如果要用scrollTo需要计算准确的位置,也就是先前的位置在加上现在移动了多少
                scrollBy(0, deltaY);
               基于这些就可以重写ScrollView的onTouchEvent并结合ScrollView的内部视图的layout()方法、TranslateAnimation()实现反弹效果。
ScrollView代码:
----------------------------------------------

package com.rebound.myscroll;
 
import android.content.Context;
import android.graphics.Rect;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;
import android.view.animation.TranslateAnimation;
import android.widget.ScrollView;
 
public class MyScrollView extends ScrollView {
    private View inner;
 
    private float y;
 
    private Rect normal = new Rect();;
 
    public MyScrollView(Context context, AttributeSet attrs) {
        super(context, attrs);
 
    }
 
    @Override
    protected void onFinishInflate() {
        if (getChildCount() > 0) {
            inner = getChildAt(0);
 
        }
    }
 
    // @Override
    // public boolean onTouchEvent(MotionEvent ev) {
    // System.out.println("onTouchEvent");
    // if (inner == null) {
    // return super.onTouchEvent(ev);
    // } else {
    // commOnTouchEvent(ev);
    // }
    //
    // return super.onTouchEvent(ev);
    // }
 
    @Override
    public boolean dispatchTouchEvent(MotionEvent ev) {
        //可以保证button等的点击事件可以被执行
        boolean dis = super.dispatchTouchEvent(ev);
        System.out.println("dispatchTouchEvent:" + dis);
        if (inner != null) {
            commOnTouchEvent(ev);
        }
        return dis;
    }
 
    public void commOnTouchEvent(MotionEvent ev) {
        int action = ev.getAction();
        switch (action) {
        case MotionEvent.ACTION_DOWN:
            y = ev.getY();
            break;
        case MotionEvent.ACTION_UP:
 
            if (isNeedAnimation()) {
                animation();
            }
 
            break;
        case MotionEvent.ACTION_MOVE:
            final float preY = y;
            float nowY = ev.getY();
            int deltaY = (int) (preY - nowY);
            // 滚动
            scrollBy(0, deltaY);
 
            y = nowY;
            // 当滚动到最上或者最下时就不会再滚动,这时移动布局
            if (isNeedMove()) {
                if (normal.isEmpty()) {
                    // 保存正常的布局位置
                    normal.set(inner.getLeft(), inner.getTop(),
                            inner.getRight(), inner.getBottom());
 
                }
                // 移动布局
                inner.layout(inner.getLeft(), inner.getTop() - deltaY,
                        inner.getRight(), inner.getBottom() - deltaY);
            }
            break;
 
        default:
            break;
        }
    }
 
    // 开启动画移动
 
    public void animation() {
        TranslateAnimation ta = new TranslateAnimation(0, 0, inner.getTop(),
                normal.top);
        ta.setDuration(200);
        inner.startAnimation(ta);
        // 设置回到正常的布局位置
        inner.layout(normal.left, normal.top, normal.right, normal.bottom);
 
        normal.setEmpty();
 
    }
 
    // 是否需要开启动画
    public boolean isNeedAnimation() {
        return !normal.isEmpty();
    }
 
    // 是否需要移动布局
    public boolean isNeedMove() {
 
        int offset = inner.getMeasuredHeight() - getHeight();
        int scrollY = getScrollY();
        if (scrollY == 0 || scrollY == offset) {
            return true;
        }
        return false;
    }
 
}

    
[3] ContentProvider的应用
    来源: 互联网  发布时间: 2014-02-18
ContentProvider的使用

红色字可以是任意字符串,但要保持一致。

<manifest .... >
    <application android:icon="@drawable/icon" android:label="@string/app_name">
        <provider android:name=".PersonContentProvider" android:authorities="cn.itcast.providers.personprovider"/>
    </application>
</manifest> 

 

public class PersonContentProvider extends ContentProvider {
    private static UriMatcher matcher = new UriMatcher(UriMatcher.NO_MATCH);
    private static final int PERSONS = 1;
    private static final int PERSON = 2;
    static{
        matcher.addURI("cn.itcast.providers.personprovider", "person", PERSONS);
        matcher.addURI("cn.itcast.providers.personprovider", "person/#", PERSON);
    }

 

public Uri insert(Uri uri, ContentValues values) {
        switch (matcher.match(uri)) {
        case PERSONS:
         
        case PERSON:
           
        default:
            throw new IllegalArgumentException("Unkown Uri:"+ uri);
        }
    }

 


    
最新技术文章:
▪Android开发之登录验证实例教程
▪Android开发之注册登录方法示例
▪Android获取手机SIM卡运营商信息的方法
▪Android实现将已发送的短信写入短信数据库的...
▪Android发送短信功能代码
▪Android根据电话号码获得联系人头像实例代码
▪Android中GPS定位的用法实例
▪Android实现退出时关闭所有Activity的方法
▪Android实现文件的分割和组装
▪Android录音应用实例教程
▪Android双击返回键退出程序的实现方法
▪Android实现侦听电池状态显示、电量及充电动...
▪Android获取当前已连接的wifi信号强度的方法
▪Android实现动态显示或隐藏密码输入框的内容
▪根据USER-AGENT判断手机类型并跳转到相应的app...
▪Android Touch事件分发过程详解
▪Android中实现为TextView添加多个可点击的文本
▪Android提高之多方向抽屉实现方法 iis7站长之家
▪Android显式启动与隐式启动Activity的区别介绍
▪Android按钮单击事件的四种常用写法总结
▪Android消息处理机制Looper和Handler详解
▪Android实现Back功能代码片段总结
▪Android实用的代码片段 常用代码总结
▪Android实现弹出键盘的方法
▪Android中通过view方式获取当前Activity的屏幕截...
▪Android提高之自定义Menu(TabMenu)实现方法
▪Android提高之多方向抽屉实现方法
▪Android提高之MediaPlayer播放网络音频的实现方法...
▪Android提高之MediaPlayer播放网络视频的实现方法...
▪Android提高之手游转电视游戏的模拟操控
 


站内导航:


特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

©2012-2021,,E-mail:www_#163.com(请将#改为@)

浙ICP备11055608号-3